Большинство компиляторов (к сожалению, IMHO) не полностью соответствуют стандарту C ++ в своих режимах по умолчанию.
Для g ++ и clang ++ вы можете использовать опции -std=c++11 -pedantic-errors
для обеспечения соблюдения требований к языку.Однако выпущенные версии g ++ не улавливают эту конкретную ошибку, которая является недостатком в g ++.
При использовании g ++ 8.2.0 объявление некорректно компилируется без диагностики:
$ cat c.cpp
bool b2 {7};
$ g++ -std=c++11 -pedantic -c c.cpp
$
При использовании clang ++ 6.0.0 правильно диагностируется ошибка:
$ clang++ -std=c++11 -pedantic -c c.cpp
c.cpp:1:10: error: constant expression evaluates to 7 which cannot be narrowed to type 'bool' [-Wc++11-narrowing]
bool b2 {7};
^
c.cpp:1:10: note: insert an explicit cast to silence this issue
bool b2 {7};
^
static_cast<bool>( )
1 error generated.
$
При использовании более новой (не выпущенной, собранной из исходного кода) версии gcc:
$ g++ -std=c++11 -pedantic -c c.cpp
c.cpp:1:11: error: narrowing conversion of ‘7’ from ‘int’ to ‘bool’ [-Wnarrowing]
1 | bool b2 {7};
| ^
$
clang ++ уже правильно диагностирует эту ошибку,Ожидайте, что g ++ сделает это в версии 9.0.0, когда она будет выпущена.
Если вы хотите, чтобы преобразование выполнялось без диагностики, вы можете использовать один из других синтаксисов инициализации, например:
bool b1 = 7; // sets b1 to true, no diagnostic