比较BitmaskType与零的正确方法?

时间:2012-11-24 19:55:33

标签: c++ c++11 bitmask c++-concepts

根据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但找不到任何涉及此主题的内容。

1 个答案:

答案 0 :(得分:4)

enum类的成员并不打算隐式转换为int,反之亦然。您可以确保将您的位掩码类型转换为int或使用enum类的零值。我认为后者更可取:

(std::launch::async & std::launch::async) != std::launch()

(我还在按位and操作周围添加了括号,因为它具有比比较更高的优先级,并且按位and具有位掩码类型的布尔值并没有多大意义

最简单的方法是7.2 [enum.dcl]第9段:

  

...请注意,没有为作用域枚举提供此隐式枚举到int转换:...

然而,这是一个非规范的例子。跟踪标准中作用域规则的规则可能需要排除允许转换的所有情况,并且目前不太喜欢这种做法。