像这样的代码可以正常工作:
char str[] = {'a', 'b', '\0'};
左边是一个自动变量(数组)。
像这样的代码不能工作:
char *str = {'a', 'b', '\0'};
左边是一个指针。指针指向一个未知空间,所以这将失败。
我的问题是,右侧的类型是什么?
在 C++ 11 中,初始化列表变为std::initializer_list
. 但是旧的 C++ 03 呢?
在 C++03 中,大括号括起来的初始化程序只是一种语法设备,可用于初始化聚合(例如数组或某些类型的类或结构)。它没有“类型”,只能用于那些特定类型的初始化器。
8.5.1/2 “聚合”:
当一个聚合被初始化时,初始化器可以包含一个初始化器子句,该子句由一个用大括号括起来、逗号分隔的初始化器子句列表组成,用于聚合的成员,以递增的下标或成员顺序编写。
在 C++03 中,右侧是一个initializer-list。它没有任何类型,它只是用于提供一种初始化标识符值的方法。
这定义在:
C++03 8.5.1 初始化程序 [dcl.init]
声明者可以为被声明的标识符指定一个初始值。标识符指定正在初始化的对象或引用。8.5 其余部分中描述的初始化过程也适用于其他句法上下文指定的初始化,例如使用参数表达式的函数参数的初始化(5.2.2)或返回值的初始化(6.6.3)。
initializer:
= initializer-clause
( expression-list )
initializer-clause:
assignment-expression
{ initializer-list ,opt }
{ }
initializer-list:
initializer-clause
initializer-list , initializer-clause
来自 C++11 的草案:
8.5 初始化器
16 初始化器的语义如下。目标类型是正在初始化的对象或引用的类型,源类型是初始化表达式的类型。当初始值设定项是花括号初始化列表或带括号的表达式列表时,源类型未定义。
int num [3] = {1,2,3} ;
int num [0]= 1 ;
num [1]= 2 ;
num [2] = 3 ;