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