2

根据这个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 buglist 但找不到任何涵盖该主题的内容。

4

1 回答 1

4

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

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

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

看到这一点的最简单方法是 7.2 [enum.dcl] 第 9 段:

...请注意,没有为范围枚举提供此隐式枚举到 int 的转换:...

然而,这属于非规范性示例。跟踪标准中范围规则的规则可能需要排除所有允许转换并且目前不太喜欢这个练习的情况。

于 2012-11-24T20:04:01.510 回答