#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] есть аналогичный пример.
Комментариев нет:
Отправить комментарий