正在缩小MSVC中到布尔警告的转换范围
Narrowing conversion to bool warning in MSVC
编译此代码时:
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
的值,即true
和false
。它不能包含其他值。
由于A::member
实际上可以表示B
的所有值,因此它不是一个缩小范围的转换,因此警告是伪造的。
相关文章:
- 获取隐式转换溢出从无符号到已签名的警告
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 隐式重新解释引用时强制转换,没有警告/错误
- 将无符号转换为复杂<int>原因符号转换警告
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- MSVC 中从 _Ty 警告到 int 警告的转换累积
- 为什么在 c++ 中索引字符串会发出隐式转换警告?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- C++:禁用隐式转换警告
- 为什么 gcc 警告只针对统一初始化缩小转换范围?
- 警告 C4267"参数":从"size_t"转换为"DWORD&quo
- 隐式转换:以下警告是否有效?
- 意外 (IMO) 常量转换警告
- C++:禁用 CMake 中的旧样式转换警告
- 键入从 DWORD 到 64 位指针的强制转换警告
- 警告 C4267"正在初始化":从'size_t'转换为"DWORD",可能会丢失数据
- isspace 函数的性能警告,从 int 转换为布尔值
- 隐式转换警告 int 到 int-looklike
- 编译器警告转换
- 将警告转换为错误