Инициализация статической переменной с самим собой
Рассмотрим следующий пример кода:
#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" - ожидаемый результат. (Это объясняет, что предупреждение о компиляторе не происходит).
Ссылка на живой пример
Ответы
Ответ 1
Я считаю, что часть стандарта относится к вашему вопросу (§3.6.2/2):
Переменные со статической продолжительностью хранения (3.7.1) или продолжительностью хранения потоков (3.7.2) должны быть инициализированы нулями (8.5) перед любой другой инициализацией. [...]
Итак, в этом случае, даже до того, как компилятор рассмотрит ваше определение bar
, он уже инициализировал нуль.
Как уже было сказано в стандарте, для инициализации статических переменных должно быть две фазы. [/p >
Вместе, нуль-инициализация и постоянная инициализация называются статической инициализацией; всякая другая инициализация динамическая инициализация. Статическая инициализация должна выполняться до начала любой динамической инициализации.