при построении переменных с использованием инициализации списка (например, int x{ 5 };
) стандарт §8.5.4 гласит:
Если требуется сужающее преобразование […] дляпреобразовать любой из аргументов, программа является плохо сформированной. (7) Сужающее преобразование - это неявное преобразование - (7.4) из целочисленного типа или перечислимого типа с незаданной областью в целочисленный тип, который не может представлять все значения исходного типа, кромегде источник - это константное выражение, значение которого после интегральных повышений будет соответствовать целевому типу.
Так почему этот компилятор?
char c{ 'A' };
char x{ c + c };
В качестве напоминания, c + c
дает int
static_assert(std::is_same_v<decltype(c + c), int>, "");
, поэтомукомпилятор должен жаловаться на сужающее преобразование, которое, конечно, не является константным выражением.
Интересно, что объявление x
как unsigned char
правильно не компилируется:
char c{ 'A' };
unsigned char x{ c + c };
C2397 преобразование из 'int' в 'unsigned char' требует сужающего преобразования
Как и введение временного:
char c{ 'A' };
int sum{ c + c };
char x{ sum }; //C2397 conversion from 'int' to 'char' requires [...]
Так почему первыйверсия компилируется?Я использую Visual Studio Community 2017 версии 15.9.5 и компилирую ее с /wall
, и все предупреждения включены в отладочную сборку x64
.Установка стандарта C ++ 11, C ++ 14 и C ++ 17 - все компилируется.
Я подал отчет об ошибке здесь