int a = 0; short b{a}; short c{0};
编译器对short b{a}
. 我可以理解这一点,因为int
缩小到short
.
但是,它没有对 发出警告short c{0}
,这对我来说很奇怪。我记得对于文字整数,类型0
至少应该是int
. 所以这里发生了从int
到缩小。short
为什么编译器不发出警告?
int a = 0; short b{a}; short c{0};
编译器对short b{a}
. 我可以理解这一点,因为int
缩小到short
.
但是,它没有对 发出警告short c{0}
,这对我来说很奇怪。我记得对于文字整数,类型0
至少应该是int
. 所以这里发生了从int
到缩小。short
为什么编译器不发出警告?
对于short c{0};
,不会发生缩小转换。因为0
是一个常量表达式,可以精确地存储在short
.
(强调我的)
list-initialization 通过禁止以下内容来限制允许的隐式转换:
...
从整数或无作用域枚举类型转换为不能表示原始所有值的整数类型,除非 source 是一个常量表达式,其值可以精确存储在目标类型中
标准中的相关解释和示例,$8.6.4/7 List-initialization [dcl.init.list]:
(强调我的)
缩小转换是隐式转换
...
从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,其值在整数提升后将适合目标类型。
[注意:如上所述,列表初始化中的顶级不允许此类转换。— 尾注] [ 示例:
// ... const int z = 99; // ... char c4{z}; // OK: no narrowing needed unsigned char uc1 = {5}; // OK: no narrowing needed // ... float f2 { 7 }; // OK: 7 can be exactly represented as a float // ...
—结束示例]