C++ 数组元素的构造顺序
Posted
技术标签:
【中文标题】C++ 数组元素的构造顺序【英文标题】:C++ array elements order of construction 【发布时间】:2013-09-26 14:17:37 【问题描述】:C++ 中是否对数组元素的构造顺序有任何保证?
#include <iostream>
using namespace std;
struct A
A() cout << this << endl;
;
int main()
cout << "[0] is " << new A[3];
打印出来
0x602010
0x602011
0x602012
[0] is 0x602010
暗示元素是按 [0]、[1] 和 [2] 的顺序构造的。语言是否保证该顺序?
【问题讨论】:
数组只是内存中的连续位置,数组中的每个元素都可以通过((数组的第一个元素的位置)+(下标 * sizeof(无论它是什么类型)))访问,所以我会说是的 是的。我会对此做出回答,但我必须寻找参考资料,而且我现在不想这样做。 【参考方案1】:是的,这是由 C++11 12.6/3 ([class.init]/3) 保证的:
当一个类对象数组被初始化(显式或隐式)并且元素被初始化时 通过构造函数,应为数组的每个元素调用构造函数,按照下标顺序
【讨论】:
这个子句对于destruction来说是相当重要的,以防在其中一个构造过程中出现异常。 而且,重要的是,它们以相反的顺序被破坏。这包括在构造过程中是否抛出异常。例如:arr[0]被构造,arr[1]被构造,arr[2]在构造过程中抛出,arr[1]被破坏,arr[0]被破坏。以上是关于C++ 数组元素的构造顺序的主要内容,如果未能解决你的问题,请参考以下文章