MSVS:三元运算符中的积分常数溢出警告

时间:2018-10-23 11:32:56

标签: c++ visual-studio ternary-operator

使用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错误还是我遗漏了一些东西?

0 个答案:

没有答案