Как компилируется код где я инициализирую переменную её же значением?

Я написал следующий код на c++ и он компилируется:

int main() {
    int x = x;
    return 0;
}

Вопрос, как? Переменная x ведь не существует до собственного объявления. Как тогда я могу использовать её для инициализации её же самой?


Ответы (2 шт):

Автор решения: Uranus

Ответ на вопрос нашел в разделе Точка объявления статьи Область видимости на cppreference.com.

Для переменных и других имён, представленных простыми объявлениями, точка объявления находится сразу после объявления имени и перед его инициализатором, если таковой имеется:

int x = 32; // внешний x находится в области видимости
{
    int x = x; // внутренний x находится в области видимости до инициализатора (= x)
               // при этом внутренний x не инициализируется значением внешнего x (32),
               // при этом внутренний x инициализируется собственным (неопределённым)
               // значением
}
→ Ссылка
Автор решения: HolyBlackCat

Нужно понимать разницу между областью видимости переменной и временем ее жизни.

Область видимости, как вы уже заметили, начинается сразу как компилятор видит ее имя в объявлении, поэтому int x = x; компилируется.

Но время жизни x начинается после завершения иницализации, а попытка прочитать ее до начала времени жизни вызывает неопределенное поведение.

→ Ссылка