将位掩码类型与零进行比较的正确方法



根据BitmaskType概念,实现必须确保以下语句是很好的:(列在 §17.5.2.1.3.4)

如果表达式 X 和 Y 不为零,则在对象 X 中设置值 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 错误列表,但找不到涵盖此主题的任何内容。

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

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

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

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

。请注意,此隐式枚举到 int 的转换不是为作用域枚举提供的:...

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

最新更新