Подтвердить что ты не робот

С++ саморегуляционный массив?

Я случайно создал ошибку в программе путем саморегуляции в массиве. Здесь очень упрощенная демо-программа похожа на концепцию:

#include <iostream>
using namespace std;

int kTest[] = {
    kTest[0]
};

int main() {
    cout << kTest[0] << endl;
}

Я был удивлен, что не получил ни компиляторской ошибки, ни даже предупреждения в этом коде! В моем случае это привело к непредсказуемым результатам. Получает ли доступ к памяти мусора?

Мне было любопытно, при каких обстоятельствах это будет иметь четко определенный результат (если вообще!).

Изменить. Имеет ли значение значение kTest static? Что насчет const? Оба?

4b9b3361

Ответ 1

int kTest[] = {
    kTest[0]
};

аналогичен, если не точно такой же, как

int x = x;

Это будет поведение undefined, если оно объявлено локально в функции.

Кажется, что он корректно определен, когда kTest является глобальной переменной. Подробнее см. другой ответ.

Ответ 2

Я не уверен, что это undefined. Цитата из текущего draft:

[basic.start.static]/3

Если константная инициализация не выполняется, переменная со статическим длительность хранения ([basic.stc.static]) или длительность хранения потоков ([basic.stc.thread]) инициализируется нулем ([dcl.init]). Вместе, нулевая инициализация и постоянная инициализация называются статическими инициализация; вся другая инициализация - это динамическая инициализация. Статическая инициализация должна выполняться до начала любой динамической инициализации.

Мне кажется, что kTest уже инициализируется нулем при инициализации динамической инициализации, поэтому его можно определить для инициализации до 0.