根据BitmaskType
概念,实施必须确保以下陈述得到很好的推荐:(列于§17.5.2.1.3.4)
如果表达式X& X,则在对象X中设置值Y. Y非零。
其中X和Y是概念类型BitmaskType
。
使用gcc 4.7尝试以下简单代码段时,我得到模板扣除错误:
#include <future>
int main() {
(std::launch::async & std::launch::async) != 0;
}
错误:
error: no match for 'operator!=' in '(std::launch)1 != 0'
... followed by tons of deduction errors
这是gcc中的错误还是我在这里弄错了?如果是,执行此类检查的正确方法是什么?
我已经检查了gcc buglist但找不到任何涉及此主题的内容。
答案 0 :(得分:4)
enum
类的成员并不打算隐式转换为int
,反之亦然。您可以确保将您的位掩码类型转换为int
或使用enum
类的零值。我认为后者更可取:
(std::launch::async & std::launch::async) != std::launch()
(我还在按位and
操作周围添加了括号,因为它具有比比较更高的优先级,并且按位and
具有位掩码类型的布尔值并没有多大意义
最简单的方法是7.2 [enum.dcl]第9段:
...请注意,没有为作用域枚举提供此隐式枚举到int转换:...
然而,这是一个非规范的例子。跟踪标准中作用域规则的规则可能需要排除允许转换的所有情况,并且目前不太喜欢这种做法。