C++ 为什么boost::variant不提供运算符=

C++ 为什么boost::variant不提供运算符=,c++,boost-variant,C++,Boost Variant,给定两个相同的boost::variant实例a和b,允许使用表达式(a==b) 但是(a!=b)似乎没有定义。为什么会这样?因为它不需要 Boost有一个定义运算符的就运算符==而言,我认为它只是没有添加到库中。运算符并没有真正的帮助,因为这两个变量都是从Boost::operator::equality\u中派生出来的。David Pierre说得对,您可以使用它,但您的回答也是正确的,新的操作员ADL找不到,因此您需要一个使用运算符 我会在boost用户邮件列表上问这个问题 编辑@AFog

给定两个相同的
boost::variant
实例
a
b
,允许使用表达式
(a==b)


但是
(a!=b)
似乎没有定义。为什么会这样?

因为它不需要


Boost有一个定义运算符的就运算符==

而言,我认为它只是没有添加到库中。运算符并没有真正的帮助,因为这两个变量都是从Boost::operator::equality\u中派生出来的。David Pierre说得对,您可以使用它,但您的回答也是正确的,新的操作员ADL找不到,因此您需要一个使用运算符

我会在boost用户邮件列表上问这个问题

编辑@AFoglia的评论:


七个月后,我正在学习Boost.Variant,我无意中发现了对省略列表更好的解释

operator==
调用变量中当前实际类的
operator==
。同样调用
操作符=还应呼叫
操作员=。(因为从理论上讲,类可以定义为
a!=b
!(a==b)
)不同,这将增加另一个要求,即变量中的类具有
运算符=。(关于您是否可以在邮件列表线程中做出这一假设存在争议。)

这就是在boost邮件列表中提出这个问题的时候


总之,在作者看来,实现比较运算符(!=和我可能是错误的。但是如果variant使用运算符库,这不意味着a!=b应该工作吗?我想他想要的是使用std::rel_ops来代替:{使用std::rel_ops::operator!=;getA()!=getB();}我并不是说variant正在使用lib本身,但是您可以自己来注入操作符!=所以期望在需要!=的源文件中包含一个额外的头并添加一个using声明?@johanneschaub-litb:减少库之间的相互依赖性也很好,并让客户端绑定该功能如果他们需要的话,我们会在更高的层次上合作,这很容易。但是让我们这样做吧,
bcp
将提取尽可能少的文件。仅boost的编译器配置部分就已经提取了1000个文件。七个月后,我正在研究boost.Variant,我无意中发现了对省略的更好解释。运算符==为当前变量中的实际类调用运算符==。同样,调用运算符!=也应调用该类的运算符!=。(因为从理论上讲,可以定义一个类,使a!=b与!(a==b)不同。)这样会增加另一个要求,即变量中的类具有运算符!=。(关于您是否可以在邮件列表线程中进行此假设存在争议。)在我看来,这是因为
==
对于
map
上下文(以及
hash\u值
)是必需的,但是操作符!=是奢侈品:)