我认为括号初始化不允许缩小。但是为什么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看到它。
答案 0 :(得分:17)
const int value2 = 12;
value2
是一个编译时常量。编译器可以轻松(且必须)证明该值为12,恰好在char
可以表示的值范围内。
int value1 = 12;
value1
不是编译时常量。变量的值可以在运行时更改。
标准规则的确切措词(引用最新草案,并增加了重点):
缩小转换是隐式转换
- 从整数类型或无作用域枚举类型到不能表示原始类型所有值的整数类型,除非源是一个常量表达式,其整数提升后的值将适合目标类型。