gpt4 book ai didi

c++ - std::strong_ordering 如何仅适用于零?

转载 作者:行者123 更新时间:2023-12-02 01:05:28 25 4
gpt4 key购买 nike

我正在研究three-way comparison运算符(operator)<=> 。我看到它返回 std::strong_ordering 。但是,我无法理解编译器如何仅限制 0在比较运算符中( so<0 ,但不是 so<1 )

#include<compare>
int main()
{
std::strong_ordering so = 55 <=> 10;

so < 0; // Fine
so < 1; // Fails
}

同样,so>20也行不通。以下也不起作用:

constexpr int Zero = 0;
so == Zero; // Error
so == 0; // Fine

编辑 - 有趣的观察(在 MSVC 编译器上)。以下内容有效:

so < nullptr

最佳答案

使用除文字 0 以外的任何内容与 std::strong_ordering 进行比较是显式未定义行为,请参阅 [cmp.categories.pre]/3 C++20 草案。

如何或是否强制/诊断这取决于编译器/标准库。

无需任何编译器魔法即可实现 UB 诊断的一种方法是使用 std::nullptr_t 作为 std::strong_ordering 的重载比较运算符的参数(根据标准,其类型未指定)。任何整数零文字都可以隐式转换为 std::nullptr_t,但具有其他值或非文字常量表达式的文字则不能。请参阅[conv.ptr]/1 .

在草稿注释中也提到了这种可能性。

Libc++ 似乎改为使用指向某个隐藏类的成员指针,请参阅 here .

Libstdc++ 似乎做了类似的事情,使用需要从指向自身的指针构造的隐藏类类型,请参阅 here .

然而,这些实现都没有根据标准诊断导致 UB 的所有参数。特别是,它们都接受 nullptr 作为参数而不进行诊断:https://godbolt.org/z/esnvqR

我想对所有情况进行全面诊断需要一些编译器魔法。

关于c++ - std::strong_ordering 如何仅适用于零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60394690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com