14

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

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

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

在 Godbolt 上看到它。

4

1 回答 1

17
const int value2 = 12;

value2是编译时常量。编译器可以轻松(并且必须)证明该值为 12,恰好在char.

int value1 = 12;

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

标准规则的确切措辞(引用最新草案,强调添加):

[dcl.init.list]/7

缩小转换是隐式转换

  • 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,其值在整数提升后将适合目标类型
于 2019-09-09T13:43:39.597 回答