这样的代码可以正常工作:
char str[] = {'a', 'b', '\0'};
左边是一个自动变量(数组)。
这样的代码可以不工作:
char *str = {'a', 'b', '\0'};
左侧是指针。指针指向一个未知空间,因此会失败。
我的问题是,右侧的类型是什么?
在C ++ 11中,初始化列表变为std::initializer_list
。但那么旧的C ++ 03呢?
答案 0 :(得分:8)
在C ++ 03中,大括号括起初始化器只是一个语法设备,可用于初始化聚合(例如数组或某些类型的类或结构)。它没有'type',只能用于那些特定类型的初始化器。
8.5.1 / 2“聚合”:
初始化聚合时,初始化程序可以包含 initializer-clause由括号括起,逗号分隔组成 编写的聚合成员的初始化子条款列表 增加下标或成员顺序。
答案 1 :(得分:4)
在C ++ 03中,右侧是初始化列表。它没有任何类型,只是为了提供初始化标识符值的方法。
这定义于:
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
答案 2 :(得分:0)
从C ++ 11草案开始:
8.5初始化程序
16初始值设定项的语义如下。目的地类型是 正在初始化的对象或引用的类型以及源 type是初始化表达式的类型。源类型不是 在初始化程序是braced-init-list或它是a时定义的 带括号的表达式列表。
答案 3 :(得分:0)
int num [3] = {1,2,3} ;
int num [0]= 1 ;
num [1]= 2 ;
num [2] = 3 ;