以下代码片段可以完美地使用 C/C++ 编译器进行编译:
#include <stdio.h>
int main()
{
int x = {5}; //<-- why this compiles?
printf("x = %d",x);
return 0;
}
输出是5
。
x
尽管它是整数类型,但在此处以复合类型形式初始化。我想了解这里进行了哪些转换以及为什么。
以下代码片段可以完美地使用 C/C++ 编译器进行编译:
#include <stdio.h>
int main()
{
int x = {5}; //<-- why this compiles?
printf("x = %d",x);
return 0;
}
输出是5
。
x
尽管它是整数类型,但在此处以复合类型形式初始化。我想了解这里进行了哪些转换以及为什么。
C允许它:
(C99,6.7.8p11)“标量的初始化程序应该是一个表达式,可选地用大括号括起来。”
C++ 在 C++11, 8.5.4p1 中也有类似的规则
这里没有进行转换,这是标准定义的变量初始化方式。
8.5.4 列表初始化[dcl.init.list]
1 列表初始化是从花括号初始化列表初始化对象或引用。这样的初始化器称为初始化器列表,列表中以逗号分隔的初始化器子句称为初始化器列表的元素。初始化列表可能为空。列表初始化可以发生在直接初始化或复制初始化上下文中;直接初始化上下文中的列表初始化称为直接列表初始化,而复制初始化上下文中的列表初始化称为复制列表初始化。
[注意:可以使用列表初始化——作为变量定义中的初始化器 (8.5)
...
[ 示例:int a = {1};