数组元素默认初始化的顺序是否已定义?

Chr*_*isB 5 c++ arrays initialization language-lawyer default-initialization

默认初始化数组时,其元素默认初始化的顺序是 C++ 标准定义的吗?

\n

举个例子,下面的C++程序是否保证打印严格升序的内存地址?

\n
#include <iostream>\nstruct Foo{\n    Foo() {\n        std::cout << this << std::endl;\n    }\n};\nint main() {\n    delete[] new Foo[10];\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在标准的 9.4.1 初始化器,常规下找到了以下内容:

\n
\n

7 默认初始化 T 类型的对象意味着:(...)

\n

(7.2)\xe2\x80\x94 如果 T 是数组类型,则每个元素都默认初始化。

\n
\n

我是否正确地假设这意味着它未指定,或者文档中的其他地方也没有对此进行澄清?

\n

这个答案声称它已经定义(根据(a)),但是(afaict)没有提供任何证据。

\n

请注意,我并不是试图在初始化之前引用数组本身(Can a (C/C++) array optimization reference itself?),而只是关心初始化顺序的可观察到的副作用。

\n

mol*_*ilo 4

最新草案 (N4917) 在 9.4.2 聚合第 7 项 ([dcl.init.aggr]) 下有这样的规定:

聚合元素的初始化按元素顺序进行评估。也就是说,与给定元素相关的所有值计算和副作用都按顺序排列在其后面的任何元素的计算和副作用之前。

所以你可以依赖订单。

  • 我确信这个规则永远都是这样,因为它是最简单、最有效的实现(至少我认为是),但 C++11 仅在有初始化器时才提到顺序,而 C++ 03关于订单根本没有什么可说的。(或者它隐藏在这两个不明显的地方。) (2认同)
  • C++98 [class.init]/3:“当初始化类对象数组时(显式或隐式),应按照下标顺序为数组的每个元素调用构造函数;请参阅 8.3.4。 [*注意:* 数组元素的析构函数按照其构造的相反顺序调用。]” (2认同)