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值
)是必需的,但是操作符!=是奢侈品:)