Определен ли порядок инициализации элементов массива по умолчанию?
Когда массив инициализируется по умолчанию, определяется ли порядок, в котором его элементы инициализируются по умолчанию, стандартом C++?
В качестве примера: гарантированно ли следующая программа на C++ печатает строго возрастающие адреса памяти?
#include <iostream>
struct Foo{
Foo() {
std::cout << this << std::endl;
}
};
int main() {
delete[] new Foo[10];
return 0;
}
В стандарте в разделе 9.4.1 «Инициализаторы, общие сведения» я нашел следующее:
7. Инициализация объекта типа T по умолчанию означает: (...)
(7.2)— Если T является типом массива, каждый элемент инициализируется по умолчанию.
Прав ли я, полагая, что это означает, что это не указано, или это разъяснено где-то еще в документе?
В этом ответе утверждается, что это определено (в соответствии с (а)), но (на самом деле) не предоставлено никаких доказательств этого.
Обратите внимание, что я не пытаюсь ссылаться на сам массив до его инициализации ( Может ли инициализация массива (C/C++) ссылаться на себя?), а просто забочусь о наблюдаемых побочных эффектах порядка инициализации.
1 ответ
В последнем проекте (N4917) в разделе 9.4.2 Агрегаты, пункт 7 ([dcl.init.aggr]) сказано следующее:
Инициализации элементов агрегата оцениваются в порядке элементов. То есть все вычисления значений и побочные эффекты, связанные с данным элементом, располагаются перед вычислениями любого элемента, следующего за ним по порядку.
Таким образом, вы можете зависеть от заказа.