正在缩小MSVC中到布尔警告的转换范围

Narrowing conversion to bool warning in MSVC

本文关键字:警告 转换 范围 布尔 缩小 MSVC      更新时间:2023-10-16

编译此代码时:

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很好。

这是的证明

这是编译器错误还是预期行为?

缩小转换定义的相关部分在C++17[dcl.init.list]/7:中

缩小转换是一种隐式转换:

  • […]
  • 从整数类型或无范围枚举类型转换为不能表示原始类型的所有值的整数类型,除非源是一个常量表达式,其值在整数提升后将适合目标类型

在您的代码中,B是一个无范围的枚举,具有固定的底层类型bool。在[dcl.enum]/8中,它说:

对于基础类型固定的枚举,枚举的值是基础类型的值

这意味着B的唯一可能值是bool的值,即truefalse。它不能包含其他值。

由于A::member实际上可以表示B的所有值,因此它不是一个缩小范围的转换,因此警告是伪造的。