Соответствующая часть определения сужающего преобразования содержится в C ++ 17 [dcl.init.list] / 7:
Сужающее преобразование - это неявное преобразование:
- [...]
- от целочисленного типа или перечислимого типа с незаданной областью до целочисленного типа, который не может представлять все значения исходного типа, кроме случаев, когда источником являетсяконстантное выражение, значение которого после интегральных повышений будет соответствовать целевому типу.
В вашем коде B
является перечислением с незаданной областью с фиксированным базовым типом bool
.В [dcl.enum] / 8 говорится:
Для перечисления, базовый тип которого фиксирован, значения перечисления являются значениями базового типа
Это означает, что единственно возможными значениями B
являются значения bool
, то есть true
и false
.Он не может содержать другие значения.
Поскольку A::member
может фактически представлять все значения B
, то это не сужающее преобразование, поэтому предупреждение является поддельным.