- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究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/
我是一名优秀的程序员,十分优秀!