16

给定两个相同的boost::variant实例ab,该表达式( a == b )是允许的。

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

4

3 回答 3

12

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

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

从@AFoglia 的评论中编辑:

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

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

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

于 2009-06-25T21:19:47.620 回答
3

当这个问题在 boost 邮件列表中提出时,这是作者本人的答案的链接

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

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

于 2012-02-26T03:34:51.273 回答
2

因为不需要。

Boost 有一个运算符库,它定义了 operator!= 的 operator==

于 2009-06-25T15:09:35.263 回答