【发布时间】:2020-06-09 04:35:27
【问题描述】:
我只是在研究three-way comparison 运算符<=>。我看到它返回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
EDIT - 有趣的观察(在 MSVC 编译器上)。以下是有效的:
so < nullptr
【问题讨论】:
-
你有什么问题? cppreference 说:“在这种类型的值和字面量 0 之间定义了比较运算符”
-
Quoting cppreference: “程序试图将 strong_ordering 与除整数字面量 0 之外的任何内容进行比较的行为是未定义的。”
-
我的问题不是关于UB,而是关于编译器报告的错误。
标签: c++ g++ c++20 visual-c++-2019