从文字缩小不会引起警告

Fun*_*aby 1 c++ initialization language-lawyer narrowing list-initialization

int a = 0; short b{a}; short c{0};

编译器给出了一个警告short b{a}.我能理解这一点,因为int它缩小了short.

但是,它没有给出警告short c{0},这对我来说很奇怪.我记得文字整数,0至少应该是这种类型int.因此,从缩小intshort发生在这里.为什么编译器没有发出警告?

son*_*yao 5

因为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
// ...
Run Code Online (Sandbox Code Playgroud)

- 结束例子]