Это моя маленькая программа:
enum Type
{
b = 1,
c = 2
};
int main()
{
Type b = b;
std::cout << b << std::endl;
return 0;
}
Какие выходы 0. Могу ли я сделать вывод, что приведенное выше определение состоит из этих последовательных шагов?
b
как переменная типа Type
0
значение по умолчаниюИ всегда ли переменные инициализируются с 0, даже если они явно инициализированы?
Мой второй вопрос — если он использует переменную в своем списке инициализации в указанном примере, почему тогда я не получаю ошибку о неоднозначности? Компилятор пытается найти b
сначала в списке переменных, и только потом проверяет объявленное перечисление?
Шаг 1 правильный, а все остальное неправильно. Что происходит, что переменная b
определяется и немедленно инициализируется значением переменной b
, Это ведет к неопределенное поведение так как b
не инициализируется перед использованием в собственной инициализации.
Если вы хотите инициализировать его Type::b
тогда вам нужно явно написать, что:
Type b = Type::b;
Несмотря на то, что переменная считается определенной во время своей собственной инициализации, все еще нельзя оценивать ее, если ее инициализация завершена. Поэтому Type b = b
является неопределенное поведение.
Причина, по которой переменная даже определена, заключается в том, что вы можете сделать это:
struct X {
int *p;
int a;
};
X x = {&x.a, 123};
cout << *x.p << endl;
Использование переменной, инициализируемой для целей, отличных от ее собственной оценки, является законным. В приведенном выше примере инициализатор x
должен иметь возможность ссылаться на x
для того, чтобы вычислить адрес его a
член. Это законно, потому что a
сам не оценивается (демонстрация).