Переменные считаются определенными при расчете их значения инициализации?

Это моя маленькая программа:

enum Type
{
b = 1,
c = 2
};

int main()
{
Type b = b;
std::cout << b << std::endl;

return 0;
}

Какие выходы 0. Могу ли я сделать вывод, что приведенное выше определение состоит из этих последовательных шагов?

  1. Декларация b как переменная типа Type
  2. Определение этой переменной и инициализация с 0 значение по умолчанию
  3. Оценка его нового значения, которое включает в себя саму переменную (со значением 0)
  4. Назначение этого нового значения переменной.

И всегда ли переменные инициализируются с 0, даже если они явно инициализированы?

Мой второй вопрос — если он использует переменную в своем списке инициализации в указанном примере, почему тогда я не получаю ошибку о неоднозначности? Компилятор пытается найти b сначала в списке переменных, и только потом проверяет объявленное перечисление?

5

Решение

Шаг 1 правильный, а все остальное неправильно. Что происходит, что переменная b определяется и немедленно инициализируется значением переменной b, Это ведет к неопределенное поведение так как b не инициализируется перед использованием в собственной инициализации.

Если вы хотите инициализировать его Type::b тогда вам нужно явно написать, что:

Type b = Type::b;
7

Другие решения

Несмотря на то, что переменная считается определенной во время своей собственной инициализации, все еще нельзя оценивать ее, если ее инициализация завершена. Поэтому Type b = b является неопределенное поведение.

Причина, по которой переменная даже определена, заключается в том, что вы можете сделать это:

struct X {
int *p;
int a;
};
X x = {&x.a, 123};
cout << *x.p << endl;

Использование переменной, инициализируемой для целей, отличных от ее собственной оценки, является законным. В приведенном выше примере инициализатор x должен иметь возможность ссылаться на x для того, чтобы вычислить адрес его a член. Это законно, потому что a сам не оценивается (демонстрация).

1

По вопросам рекламы [email protected]