(C/C++)数组初始化本身是否可以引用

Can a (C/C++) array initialization reference itself?

本文关键字:是否 引用 初始化 C++ 数组      更新时间:2023-10-16

我想知道以下表单的初始化:

int  array[] = {
v - 1,
array[0] + 1
} ;

在第二个元素的初始化中,使用了第一个元素的值,但整个数组尚未初始化。这恰好是用g++编译的,但我不确定这是否真的是可移植的,是否是一个定义良好的构造?

参见3.3.2申报点:

名称的声明点紧接在其完整声明人之后(第8条)初始值设定项(如果有),除非下文另有说明。[示例:

int x = 12;
{ int x = x; }

这里,第二个x是用它自己的(不确定的)值初始化的--结束示例]

因此,您正确地引用了数组,它的名称在=之后才知道。

然后,8.5.1骨料:

聚合是数组或类〔…〕

17:初始值设定项子句中的完整表达式按照它们出现的顺序进行求值。

然而,我看不到对计算值实际写入数组的时间的引用,所以我不会依赖于此,甚至会声明您的代码定义不好。

据我所见,这不是一个定义良好的。标准(C++11,8.5.1/17)规定"初始值设定项子句中的完整表达式按其出现的顺序进行求值",但我看不到任何要求在求值下一个聚合元素之前,根据其初始化项子句的结果对每个聚合元素进行初始化的内容。

(C/C++)数组初始化是否可以引用自身?

这也是有效的C代码。

C有一些对应的段落(重点是我的)。

(C99,6.2.1p7)"结构、并集和枚举标记的作用域在声明标记的类型说明符中的标记出现之后才开始。每个枚举常量的作用域都在枚举器列表中其定义枚举器出现之后才结束。任何其他标识符的作用域也在其声明器完成之后才开始的。"

我认为这是由http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1343。最初,我的报告只是关于命名空间范围对象的非类初始化器(请参阅初始化器究竟何时被临时销毁?),但如果聚合元素是非类的,那么问题也存在。正如最近的附加说明所解释的,即使它是一个类对象,在整个聚合初始化中似乎也存在,因为这样就不会发生会放大初始化器的完整表达式的构造函数调用。

如果您使用的不是int,而是一个类,并且初始化将是一个构造函数调用,那么该构造函数调用将是同一个完整表达式的一部分,该表达式包含initializer元素中的聚合,这样这里的顺序就可以了,您的代码也就定义良好了。