给定两个相同的boost::variant
实例a
和b
,该表达式( a == b )
是允许的。
但是( a != b )
似乎未定义。为什么是这样?
我认为它只是没有添加到库中。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!=
. (关于你是否可以在邮件列表线程中做出这个假设存在争议。)
当这个问题在 boost 邮件列表中提出时,这是作者本人的答案的链接
总结一下,在作者看来,实现比较运算符(!= 和 <)将对用于创建变体类型的类型增加更多要求。
不过我不同意他的观点,因为 != 可以以与 == 相同的方式实现,而不必为构成变体的每种类型隐藏这些运算符的可能实现
因为不需要。
Boost 有一个运算符库,它定义了 operator!= 的 operator==