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 шт):

Автор решения: Andrey Tabakov

Это было ошибкой, но в версии 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

→ Ссылка