为什么对于char括号初始化,const int是合适的?

14

我曾以为花括号初始化不允许缩小转换。但是为什么对于char类型的花括号初始化却允许使用int const呢?

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

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

在 Godbolt 上查看


你使用哪个编译器和哪些选项?这也取决于它! - csabinho
1个回答

17
const int value2 = 12;

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

int value1 = 12;

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

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

[dcl.init.list]/7

狭窄转换是隐式转换之一

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接