C ++ Prog Lang page page 139 например - PullRequest
0 голосов
/ 09 февраля 2019

Я изучаю «Язык программирования C ++» Бьярна Страуструпа.На странице 139 приведен следующий пример кода, который не будет компилироваться.

bool b2 {7}; // error : narrowing

Когда я попробовал этот пример, он компилируется.Кто-нибудь может объяснить, почему?

1 Ответ

0 голосов
/ 09 февраля 2019

Большинство компиляторов (к сожалению, 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
...