Определен ли порядок инициализации элементов массива по умолчанию?

Когда массив инициализируется по умолчанию, определяется ли порядок, в котором его элементы инициализируются по умолчанию, стандартом 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]) сказано следующее:

Инициализации элементов агрегата оцениваются в порядке элементов. То есть все вычисления значений и побочные эффекты, связанные с данным элементом, располагаются перед вычислениями любого элемента, следующего за ним по порядку.

Таким образом, вы можете зависеть от заказа.

Другие вопросы по тегам