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

Инициализация статической переменной с самим собой

Рассмотрим следующий пример кода:

#include <iostream>

static int bar = bar;

int main()
{
    int foo = foo;
    std::cout << "foo = " << foo << std::endl;
    std::cout << "bar = " << bar << std::endl;
}

Я получаю следующее предупреждение компилятора:

main.cpp: In function 'int main()':
main.cpp:7:15: warning: 'foo' is used uninitialized in this function [-Wuninitialized]
     int foo = foo;
               ^

Вывод:

foo = 0
bar = 0

Я ожидал этого предупреждения, поскольку foo используется унифицированным. Вместо 0, "foo" может быть любым. Самоназначение undefined.

Но почему самоназвание "бар" не предупреждается? Является ли это назначение "bar" определенным или undefined поведением и почему?

Я знаю, что статические переменные типов элементарных данных инициализируются "0", но в этом случае переменная "bar" используется во время ее инициализации. Мне интересно, если это определено поведение, а "0" - ожидаемый результат. (Это объясняет, что предупреждение о компиляторе не происходит).

Ссылка на живой пример

4b9b3361

Ответ 1

Я считаю, что часть стандарта относится к вашему вопросу (§3.6.2/2):

Переменные со статической продолжительностью хранения (3.7.1) или продолжительностью хранения потоков (3.7.2) должны быть инициализированы нулями (8.5) перед любой другой инициализацией. [...]

Итак, в этом случае, даже до того, как компилятор рассмотрит ваше определение bar, он уже инициализировал нуль.

Как уже было сказано в стандарте, для инициализации статических переменных должно быть две фазы. [/p >

Вместе, нуль-инициализация и постоянная инициализация называются статической инициализацией; всякая другая инициализация динамическая инициализация. Статическая инициализация должна выполняться до начала любой динамической инициализации.