Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Компилятор не поддерживает расширенную инициализацию

#cpp #gcc #cpp11 #инициализация


Имеется такой код:

int main() {
    double d {4.5};
    int x {d};
}


Прочитал, что в новой версии С++11 есть поддержка на запрет сужающих преобразований
при инициализации. Но компилятор ошибки не выдает, хотя должен (ибо я пытаюсь double
в int преобразовать с синтаксисом новой версии инициализации (с помощью фигурных скобок),
которая как раз запрещает подобные небезопасные преобразования. 

IDE - DevC++ 5.11
Компилятор - TDM-GCC 4.9.2.

Вопрос: Так почему нет поддержки этой новой инициализации? Компилятор новый же, его
вместе со средой скачал недавно вот.
    


Ответы

Ответ 1



Стандарт С++ не обязывает реализацию языка выдавать именно "ошибку компиляции" для случаев когда в стандарте написано что код ошибочен. (Однако при этом не должно ломается SFINAE, иначе это уже баг компилятора). Компилятор g++ в некоторых случаях ограничивается предупреждением: double d = 4.5; int x{d}; // предупреждение в g++ int y{4.5}; // ошибка в g++ Впрочем этого достаточно, т.к. рекомендуется компилировать код с -Wall -pedantic -Werror. Что касается стандарта, то int x{d}; это несомненно неправильный код. В разделе [dcl.init.list] есть аналогичный пример.

Комментариев нет:

Отправить комментарий