【发布时间】:2009-06-25 15:01:41
【问题描述】:
给定两个相同的 boost::variant 实例 a 和 b,允许使用表达式 ( a == b )。
但是 ( a != b ) 似乎是未定义的。这是为什么呢?
【问题讨论】:
-
在我看来这是因为
map的满足需要==,(以及hash_value),但运算符!= 是奢侈的:)
标签: c++ boost-variant
给定两个相同的 boost::variant 实例 a 和 b,允许使用表达式 ( a == b )。
但是 ( a != b ) 似乎是未定义的。这是为什么呢?
【问题讨论】:
map 的满足需要==,(以及hash_value),但运算符!= 是奢侈的:)
标签: c++ boost-variant
我认为它只是没有添加到库中。 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!=。 (关于您是否可以在邮件列表线程中做出这种假设存在争议。)
【讨论】:
这是a link to the answer from the author himself,当这个问题在 boost 邮件列表中提出时
总结一下,在作者看来,实现比较运算符(!= 和
不过我不同意他的观点,因为 != 可以以与 == 相同的方式实现,而不必为构成变体的每种类型隐藏这些运算符的可能实现
【讨论】:
因为它不需要。
Boost 有一个 operators library,它根据 operator== 定义 operator!=
【讨论】:
bcp 提取尽可能少的文件。仅 boost 的编译器配置部分就已经拉取了一千个文件。