我曾以为花括号初始化不允许缩小转换。但是为什么对于char类型的花括号初始化却允许使用int const呢?
int value1 = 12;
char c1{value1}; // error! no narrowing
const int value2 = 12;
char c2{value2}; // why is this fine?
在 Godbolt 上查看 它。
const int value2 = 12;
value2
是一个编译时常量。编译器可以轻松证明该值是12,这恰好在char
可表示的值的范围内。
int value1 = 12;
value1
不是编译时常量。该变量的值可能会在运行时更改。
标准规则的确切措辞(引用最新草案,强调添加):
狭窄转换是隐式转换之一
- 从整数类型或未作用域枚举类型到无法表示原始类型所有值的整数类型的转换, 除非源是一个常量表达式,其经过整数提升后的值适合于目标类型。