Aja*_*jay 6 c++ g++ c++20 visual-c++-2019
我只是研究一个三路比较操作<=>。我看到它返回std::strong_ordering。但是,我无法理解编译器如何仅0在比较运算符(so<0,但不是so<1)中进行限制
#include<compare>
int main()
{
std::strong_ordering so = 55 <=> 10;
so < 0; // Fine
so < 1; // Fails
}
Run Code Online (Sandbox Code Playgroud)
同样,so>20也行不通。以下也不起作用:
constexpr int Zero = 0;
so == Zero; // Error
so == 0; // Fine
Run Code Online (Sandbox Code Playgroud)
编辑- 有趣的观察(在 MSVC 编译器上)。以下是有效的:
so < nullptr
使用除文字以外的任何内容0进行比较std::strong_ordering都是明确的未定义行为,请参阅C++20 草案的[cmp.categories.pre]/3。
如何或是否强制执行/诊断这取决于编译器/标准库。
在没有任何编译器魔法的情况下实现 UB 诊断的一种方法是将其std::nullptr_t用作重载比较运算符的参数std::strong_ordering(根据标准,它具有未指定的类型)。任何整数零文字都可以隐式转换为std::nullptr_t,但具有其他值的文字或不是文字的常量表达式不能。见[conv.ptr]/1。
在一份说明草案中也提到了这种可能性。
Libc++ 似乎改为使用指向某个隐藏类的成员指针,请参见此处。
Libstdc++ 似乎做了类似的事情,使用需要从指向自身的指针构造的隐藏类类型,请参见此处。
然而,这些实现都没有根据标准诊断导致 UB 的所有参数。特别是所有这些也接受nullptr没有诊断的参数:https : //godbolt.org/z/esnvqR
我想对所有情况的全面诊断需要一些编译器魔术。
| 归档时间: |
|
| 查看次数: |
422 次 |
| 最近记录: |