При инициализации списка требуется сужающее преобразование

Я читал о сужении конверсии на справочном сайте cpp. Я как бы понял это, но я не понимаю, почему ошибка присутствует только в первой строке.

    long double ld = 3.1415926536;
    int a{ld}, b = {ld}; // error: narrowing conversion required
    int c(ld), d = ld;   // ok: but value will be truncated

Почему ошибка присутствует только в первой строке, а не во второй?


person daljinder singh    schedule 17.05.2017    source источник
comment
Имейте в виду, что унифицированная инициализация - более новая концепция. Он был разработан с учетом преимуществ ретроспективного анализа. Также имейте в виду, что изменение поведения давно установленных механизмов может оказаться нетривиальным.   -  person François Andrieux    schedule 17.05.2017


Ответы (1)


Поскольку компилятор должен выдать диагностику (в вашем случае ошибка) для сужения только для инициализация списка (также известная как равномерная инициализация), введенная начиная с C ++ 11. Для инициализации до C ++ 11 без фигурных скобок диагностика не требуется.

Дополнительную информацию см. В документации cppreference.com.

Также см. этот ответ о том, почему компилятор должен только выдавать предупреждение, а не обязательно ошибку.

person vsoftco    schedule 17.05.2017
comment
Обратите внимание, что у большинства компиляторов есть параметры / флаги, которые вы можете включить, что заставит их также выдавать диагностику для сужения преобразований формы до C ++ 11 - если вы того пожелаете (для gcc это будет -Wnarrowing). - person Jesper Juhl; 17.05.2017
comment
И дело не только в новом синтаксисе. int a[] = {ld}; был действительным C ++ 03, но стал недействительным в C ++ 11. - person ; 17.05.2017
comment
@hvd Я думаю, что теперь это тоже считается инициализацией списка, хотя я не могу на это делать ставку. - person vsoftco; 17.05.2017