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

BK *_* C. 14 c++ const narrowing c++11

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

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

const int value2 = 12;
char c2{value2};   // why is this fine?
Run Code Online (Sandbox Code Playgroud)

在Godbolt上看到它。

eer*_*ika 17

const int value2 = 12;
Run Code Online (Sandbox Code Playgroud)

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

int value1 = 12;
Run Code Online (Sandbox Code Playgroud)

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

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

[dcl.init.list] / 7

缩小转换是隐式转换

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