std :: variant与内部std :: nullptr_t的比较

时间:2019-09-26 17:01:35

标签: c++ c++17

我的问题可以总结为以下代码

#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支持比较运算符的任何信息,甚至GCCClang似乎也意见不同。它应该工作吗?此外,如果没有正确答案,是否有办法使它起作用?为std::nullptr_t定义运算符似乎不起作用。

inline bool operator<(std::nullptr_t, std::nullptr_t)
{
    return false;
}

由于定义关系运算符只能在类参数上完成。

谢谢。

1 个答案:

答案 0 :(得分:5)

类型std::nullptr_t没有为其定义任何关系运算符。它仅是可比的(nullptr == nullptr有效且true,但nullptr < nullptr格式错误)。您可能会说这是一个缺陷,我们可以定义关系运算符,使得nullptr < nullptrfalse,而nullptr <= nullptrtrue,依此类推。是。

<上使用variant<Ts...>要求<Ts...中每种类型的有效操作,在您的示例中不是这种情况,因此{{1} }格式错误。这不是任何编译器或库中的错误,这是预期的行为。


在这里使a < b工作的唯一方法是提供实际上具有<的类型-也就是说,将<包裹在实际上已排序的其他类型中。您是否特别需要std::nullptr_t?也许拥有所有六个比较的std::nullptr_t是更好的选择?