int a = 0; short b{a}; short c{0};
编译器为short b{a}
提供了警告。我可以理解这一点,因为int
缩小为short
。
然而,它并未向short c{0}
发出警告,这对我来说很奇怪。我记得文字整数,0
的类型至少应该是int
。因此,从int
缩小到short
正在发生变化。为什么编译器没有发出警告?
答案 0 :(得分:5)
对于short c{0};
,narrowing conversion不会发生。因为0
是一个常量表达式,可以精确地存储在short
。
(强调我的)
list-initialization通过禁止以下内容来限制允许的隐式转换:
...
从整数或无范围枚举类型转换为不能表示原始值的整数类型,除非source是一个常量表达式,其值可以精确地存储在目标类型中 < / p>
标准中的相关解释和示例,$8.6.4/7 List-initialization [dcl.init.list]:
(强调我的)
缩小转化是隐式转化
...
从整数类型或未范围的枚举类型到不能表示原始类型的所有值的整数类型,除外 其中source是一个常量表达式,其值在积分之后 促销活动将适合目标类型。
[注意:如上所述,此类转换不允许在 列表初始化中的顶级。 - 尾注] [例子:
// ... 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 // ...
- 结束示例]