Проверьте эту простую программу:
int main() {
float f2 = 7.2; // OK, with warning
float f3 = 7.199999809265137; // OK, no warning
float f4{ 7.2 }; // Fails
float f5{ 7.199999809265137 }; // OK, no warning
float f6 = { 7.2 }; // Fails
float f7 = { 7.199999809265137 }; // OK, no warning
}
При компиляции с MSVC 2015 с параметрами по умолчанию (cl /W4
, версия 19.00.23918) я получаю следующие сообщения:
FloatTest.cpp(2): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(4): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(4): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(6): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(6): warning C4305: 'initializing': truncation from 'double' to 'float'
Эта программа отлично компилируется с Clang 3.0-3.8 и GCC 4.5.4-6.1.0 (проверено с помощью http://melpon.org/wandbox ), с предупреждениями только о неиспользуемых переменных. Кроме того, удаление/комментирование строк f4
и f6
приводит к успешной компиляции (только с одним предупреждением для строки f2
).
Сначала кажется, что MSVC просто говорит мне, что 7.2 не может быть представлено именно как float
, так что это сужающее преобразование (что недопустимо при инициализации фигурных скобок). Однако стандарт (проект N3337), раздел 8.5. 4, примечание 7, говорит следующее:
Сужающее преобразование – это неявное преобразование...
- от
long double
доdouble
илиfloat
или отdouble
доfloat
, за исключением случаев, когда источником является постоянное выражение, а фактическое значение после преобразования находится в пределах диапазона значений, которые могут быть представлены (даже если оно не может быть точно представлено сильный>)
Акцент мой. Поскольку 7.2 находится в диапазоне значений, представляемых float
, его преобразование в float
не должно быть сужающим преобразованием в соответствии со стандартом. Является ли MSVC неправильным здесь, и я должен сообщить об ошибке?
/W4
, пожалуйста. - person Richard Critten   schedule 09.07.2016f
в конце литералов? - person Chris Beck   schedule 09.07.2016