我想知道以下形式的初始化:
int array[] = {
v - 1,
array[0] + 1
} ;
在第二个元素的初始化中,使用了第一个元素的值,但整个数组尚未初始化。这在使用g++编译时可以编译通过,但我不确定这是否是可移植和明确定义的构造方式?我想知道以下形式的初始化:
int array[] = {
v - 1,
array[0] + 1
} ;
在第二个元素的初始化中,使用了第一个元素的值,但整个数组尚未初始化。这在使用g++编译时可以编译通过,但我不确定这是否是可移植和明确定义的构造方式?见 3.3.2 声明点:
名称的声明点在其完整声明符(Clause 8)之后、初始化程序(如果有的话)之前立即出现,除非下面有特别说明。[ 示例:
int x = 12;
{ int x = x; }
这里第二个x使用它自己的(不确定)值进行初始化。- 示例结束]
所以你正确地引用了数组,它的名称在=
之后是已知的。
然后,根据8.5.1聚合:
聚合是数组或类[...]
17:初始化器中的完整表达式按照它们出现的顺序进行评估。
然而,我没有看到任何关于何时将评估的值实际写入数组的参考资料,因此我不会依赖于此,并且甚至会进一步声明你的代码未定义。
据我所见,这个问题尚未有明确定义。标准(C++11, 8.5.1/17)规定,“初始化列表中的完整表达式按照它们出现的顺序进行评估”,但我并没有看到任何要求每个聚合元素在下一个被评估之前必须从其初始化列表的结果中初始化。
如果您使用了一个类而不是int
,并且初始化将是一个构造函数调用,那么这个构造函数调用将成为包含聚合初始化程序元素的同一完整表达式的一部分,因此这里的顺序将是正确的,您的代码将被定义良好。