5

以下代码片段可以完美地使用 C/C++ 编译器进行编译:

#include <stdio.h>
int main()
{
    int x = {5};         //<-- why this compiles?
    printf("x = %d",x);
    return 0;
}

输出是5x尽管它是整数类型,但在此处以复合类型形式初始化。我想了解这里进行了哪些转换以及为什么。

4

2 回答 2

8

C允许它:

(C99,6.7.8p11)“标量的初始化程序应该是一个表达式,可选地用大括号括起来。”

C++ 在 C++11, 8.5.4p1 中也有类似的规则

于 2013-07-05T14:10:04.930 回答
3

这里没有进行转换,这是标准定义的变量初始化方式。

8.5.4 列表初始化[dcl.init.list]

1 列表初始化是从花括号初始化列表初始化对象或引用。这样的初始化器称为初始化器列表,列表中以逗号分隔的初始化器子句称为初始化器列表的元素。初始化列表可能为空。列表初始化可以发生在直接初始化或复制初始化上下文中;直接初始化上下文中的列表初始化称为直接列表初始化,而复制初始化上下文中的列表初始化称为复制列表初始化。
[注意:可以使用列表初始化——作为变量定义中的初始化器 (8.5)
...
[ 示例:int a = {1};

于 2013-07-05T14:12:24.223 回答