我的问题可以总结为以下代码
#include <variant>
int main()
{
using V = std::variant<int, std::nullptr_t>;
V a = 0;
V b = nullptr;
a < b;
}
Run Code Online (Sandbox Code Playgroud)
我希望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;
}
Run Code Online (Sandbox Code Playgroud)
由于定义关系运算符只能在类参数上完成。
谢谢。
该类型std::nullptr_t没有定义任何关系运算符。它仅是相等可比的(nullptr == nullptr有效且true,但nullptr < nullptr格式不正确)。您可能会争辩说这是一个缺陷,我们可以定义关系运算符,例如nullptr < nullptris false和nullptr <= nullptris true,等等。但这就是事实。
使用<on variant<Ts...>需要<对中的每个类型进行有效操作Ts...,在您的示例中不是这种情况,因此格式不a < b正确。这不是任何编译器或库中的错误,这是预期的行为。
在<这里进行工作的唯一方法是提供实际上具有<-的类型,即包装std::nullptr_t实际上已排序的其他类型。您是否特别需要std::nullptr_t?也许std::monostate具有全部六个比较的一个更好的选择?