MSVS: интегральное постоянное предупреждение о переполнении в троичном операторе - PullRequest
0 голосов
/ 23 октября 2018

Компиляция следующего кода с 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 или я что-то упустил?

...