我的问题可以总结为以下代码
#include <variant>
int main()
{
using V = std::variant<int, std::nullptr_t>;
V a = 0;
V b = nullptr;
a < b;
}
我想要内部带有std::nullptr_t
的变体,并且希望能够比较这些变体。它可以在Visual Studio 2018(版本16.1.X)上运行,但无法在版本16.3.1上进行编译。我以为这是编译器中的错误,但现在不确定。我找不到关于std::nullptr_t
支持比较运算符的任何信息,甚至GCC和Clang似乎也意见不同。它应该工作吗?此外,如果没有正确答案,是否有办法使它起作用?为std::nullptr_t
定义运算符似乎不起作用。
inline bool operator<(std::nullptr_t, std::nullptr_t)
{
return false;
}
由于定义关系运算符只能在类参数上完成。
谢谢。
答案 0 :(得分:5)
类型std::nullptr_t
没有为其定义任何关系运算符。它仅是可比的(nullptr == nullptr
有效且true
,但nullptr < nullptr
格式错误)。您可能会说这是一个缺陷,我们可以定义关系运算符,使得nullptr < nullptr
是false
,而nullptr <= nullptr
是true
,依此类推。是。
在<
上使用variant<Ts...>
要求<
是Ts...
中每种类型的有效操作,在您的示例中不是这种情况,因此{{1} }格式错误。这不是任何编译器或库中的错误,这是预期的行为。
在这里使a < b
工作的唯一方法是提供实际上具有<
的类型-也就是说,将<
包裹在实际上已排序的其他类型中。您是否特别需要std::nullptr_t
?也许拥有所有六个比较的std::nullptr_t
是更好的选择?