(C/C++)数组初始化本身是否可以引用
Can a (C/C++) array initialization reference itself?
我想知道以下表单的初始化:
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元素中的聚合,这样这里的顺序就可以了,您的代码也就定义良好了。
- 具有引用成员的结构是否具有唯一的对象表示形式
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 通过引用访问矢量元素是否会降低C++的空间复杂性?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 形成对对象的引用是否构成访问?
- std::vector 是否有用于引用的复制构造函数?
- C++ 引用是否在需要时隐式转换为值?
- 如何检测两个文件条目是否引用与Qt相同的物理文件系统?
- 是否引用右值
- 在 c++ 中,知道路径是否引用文件夹或文件的最便宜的方法是什么?
- 测试一个东西是否引用了另一个东西