根据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 的转换不是为作用域枚举提供的:...
然而,这是一个非规范的例子。跟踪标准中作用域规则的规则可能需要排除所有允许转换的情况,并且目前不太喜欢此练习。