Компиляция следующего кода с 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>
base struct
, однако, выбрано правильно.Похоже, что компилятор пытается оценить как второе, так и третье выражения.Однако в стандарте [expr.cond] / 1 говорится:
Группа условных выражений справа налево.Первое выражение контекстно преобразуется в bool
.Он вычисляется и, если оно равно true
, результатом условного выражения является значение второго выражения, в противном случае - значение третьего выражения. Оценивается только одно из второго и третьего выражений. ...
gcc или clang не выдает такого предупреждения.Более того, если я изолирую троичного оператора в constexpr
функцию
constexpr auto f(unsigned int i)
{
return i != 0 ? 2 * (i - 1) : 0;
}
, предупреждение исчезнет.
Это ошибка MSVS или я что-то упустил?