为什么const int对于char brace init很好?

时间:2019-09-09 13:37:33

标签: c++ c++11 const narrowing

我认为括号初始化不允许缩小。但是为什么int const被允许char大括号初始化?

int value1 = 12;
char c1{value1};  // error! no narrowing

const int value2 = 12;
char c2{value2};   // why is this fine?

on Godbolt看到它。

1 个答案:

答案 0 :(得分:17)

const int value2 = 12;

value2是一个编译时常量。编译器可以轻松(且必须)证明该值为12,恰好在char可以表示的值范围内。

int value1 = 12;

value1不是编译时常量。变量的值可以在运行时更改。

标准规则的确切措词(引用最新草案,并增加了重点):

  

[dcl.init.list]/7

     

缩小转换是隐式转换

     
      
  • 从整数类型或无作用域枚举类型到不能表示原始类型所有值的整数类型,除非源是一个常量表达式,其整数提升后的值将适合目标类型
  •