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

时间:2009-06-25 15:01:42

标签: c++ boost-variant

鉴于两个相同的boost::variant个实例 a b ,表达式 ( a == b ) 是允许的。

( a != b ) 似乎未定义。这是为什么?

3 个答案:

答案 0 :(得分:12)

我认为它只是没有添加到库中。 Boost.Operators实际上并没有帮助,因为任何一个变体都是从boost :: operator :: equality_comparable派生的。 David Pierre说你可以使用它,但你的反应也是正确的,ADL找不到新的运算符!=所以你需要一个使用运算符。

我会在boost-users邮件列表中问这个问题。

编辑来自@ AFoglia的评论:

七个月后,我正在研究Boost.Variant,我偶然发现了这个遗漏名单的更好解释。

http://boost.org/Archives/boost/2006/06/105895.php

operator==为当前变体中的实际类调用operator==。同样,调用operator!=也应该调用该类的operator!=。 (因为从理论上讲,可以定义一个类,因此a!=b!(a==b)不同。)这样就会增加另一个要求,即变量中的类具有operator!=。 (关于你是否可以在邮件列表主题中做出这个假设存在争议。)

答案 1 :(得分:3)

这个问题是在提升邮件列表

上制定的a link to the answer from the author himself

总结一下,在作者看来,实现比较运算符(!=和<)会对用于创建变体类型的类型添加更多要求。

我不同意他的观点,因为!=可以用与==相同的方式实现,而不必为构成变体的每种类型隐藏这些运算符的可能实现

答案 2 :(得分:2)

因为它不需要。

Boost有一个operators library,它定义了operator!= in operator ==