使用MSVS编译以下代码(带有/W3
选项的最新预览版本)
template<unsigned int i>
struct T { };
template<unsigned int i>
struct S : T<i != 0 ? 2 * (i - 1) : 0 /* f(i) */> { };
void foo() {
S<0> s0;
}
我收到警告消息:
但是,已正确选择警告C4307:“ *”:整数常量溢出
T<0>
为基础的struct
。看起来编译器试图同时评估第二个和第三个表达式。但是,该标准 [expr.cond] / 1 的内容为:
条件表达式从右到左分组。第一个表达式在上下文中转换为
bool
。将对其求值,如果它为true
,则条件表达式的结果为第二个表达式的值, 否则第三个表达式。 仅计算第二个和第三个表达式之一。 ...
gcc或clang不会发出此类警告。此外,如果我将三元运算符隔离为constexpr
函数
constexpr auto f(unsigned int i)
{
return i != 0 ? 2 * (i - 1) : 0;
}
警告消失。
是MSVS错误还是我遗漏了一些东西?