GCC выдает предупреждение о сужающем преобразовании вместо ошибки
Читаю книгу Страуструпа "Программирование. Принципы и практика использования C++". В главе о безопасности типов написано, что необходимо избегать сужающего преобразования. В качестве одного из безопасных методов инициализации объекта представлена инициализация с фигурными скобкам int x {100}. Экспериментируя, я специально написал код с ошибкой
int main() {
int x = 1000;
char y {x};
int mee = y;
cout << mee;
}
Почему компилятор gcc выполняет программу и выдает лишь предупреждение warning: narrowing conversion of 'x' from 'int' to 'char' [-Wnarrowing]. Ведь подобный способ инициализации запрещает сужающее преобразование. Я ожидал увидеть ошибку, как это происходит в MSVC.
Ответы (1 шт):
Это было ошибкой, но в версии gcc 4.7 это поведение намерено изменили. Проблема была в компиляции больших кусков кода написанных на c++03 в c++11.
Люди жаловались что у них был написан код вида:
for (int i=0; i < 10; ++i) { char c[] = { i, 0 }; ... }
Где i явно не превышало размеры char, но с выходом нового стандарта, этот код перестал компилироваться и стал выдавать кучу ошибок.
Можно сделать эти предупреждения ошибкой, скомпилировав с флагом
-Werror=narrowing
Источник: https://gcc.gnu.org/wiki/FAQ#Wnarrowing