C ++ 0x сделает следующий код и аналогичный код некорректным, поскольку он требует так называемого сужающего преобразования a double
в a int
.
int a[] = { 1.0 };
Мне интересно, часто ли этот вид инициализации используется в реальном коде. Сколько кода будет нарушено этим изменением? Сложно ли исправить это в вашем коде, если он вообще затронут?
Для справки см. 8.5.4 / 6 в n3225.
Сужающее преобразование - это неявное преобразование
- от типа с плавающей запятой к целочисленному типу или
- от long double до double или float, или от double до float, за исключением случаев, когда источник является постоянным выражением, а фактическое значение после преобразования находится в пределах диапазона значений, которые могут быть представлены (даже если оно не может быть представлено точно), или
- из целочисленного типа или типа перечисления без области действия в тип с плавающей точкой, за исключением случаев, когда источник является постоянным выражением, а фактическое значение после преобразования будет соответствовать целевому типу и даст исходное значение при преобразовании обратно в исходный тип, или
- из целочисленного типа или типа перечисления без области действия в целочисленный тип, который не может представлять все значения исходного типа, за исключением случаев, когда источник является постоянным выражением, а фактическое значение после преобразования будет соответствовать целевому типу и даст исходное значение, когда преобразован обратно в исходный тип.