Сужение конверсии в bool предупреждение в MSVC - PullRequest
0 голосов
/ 12 февраля 2019

При компиляции этого кода:

enum B: bool { T = true };
struct A { bool member; };

void foo(const B b = T)
{
    A a{b}; // warning here
}

void bar()
{
    const B b = T;
    A a{b};
}

MSVC выдает предупреждение в foo:

предупреждение C4838: преобразование из 'const B' в 'bool' требуетсужающее преобразование

, но компилируется bar отлично.

Вот доказательство

Это ошибка компилятора или предполагаемое поведение?

1 Ответ

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

Соответствующая часть определения сужающего преобразования содержится в C ++ 17 [dcl.init.list] / 7:

Сужающее преобразование - это неявное преобразование:

  • [...]
  • от целочисленного типа или перечислимого типа с незаданной областью до целочисленного типа, который не может представлять все значения исходного типа, кроме случаев, когда источником являетсяконстантное выражение, значение которого после интегральных повышений будет соответствовать целевому типу.

В вашем коде B является перечислением с незаданной областью с фиксированным базовым типом bool.В [dcl.enum] / 8 говорится:

Для перечисления, базовый тип которого фиксирован, значения перечисления являются значениями базового типа

Это означает, что единственно возможными значениями B являются значения bool, то есть true и false.Он не может содержать другие значения.

Поскольку A::member может фактически представлять все значения B, то это не сужающее преобразование, поэтому предупреждение является поддельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...