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++ 数组元素的构造顺序的主要内容,如果未能解决你的问题,请参考以下文章

顺序容器C++

顺序容器C++

C++对象数组与对象指针

洗牌算法C++将数组的元素顺序随机打乱(条件概率证明算法充分随机)

C++容器

C++创建派生类对象时,调用构造函数顺序