Рассмотрим следующий пример кода:
#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" - ожидаемый результат. (Это объясняет, что предупреждение о компиляторе не происходит).