这是我的小程序:
enum Type
{
b = 1,
c = 2
};
int main()
{
Type b = b;
std::cout << b << std::endl;
return 0;
}
哪个输出0.我可以断定上面的定义是由这些连续的步骤组成的吗?
b
为Type
0
默认值并且,变量是否始终用0初始化,即使它们是显式初始化的?
我的第二个问题是 - 如果它在指定示例中使用其中的变量初始化列表,为什么我不会得到有关歧义的错误?编译器是否首先尝试在变量列表中查找b
,然后才检查声明的枚举?
答案 0 :(得分:7)
第1步是正确的,但其余的都是错误的。会发生的是变量b
被定义并立即初始化为变量b
的值。这会导致未定义的行为,因为b
在初始化之前未初始化。
如果要将其初始化为Type::b
,则需要明确写出:
Type b = Type::b;
答案 1 :(得分:1)
虽然变量在其自己的初始化期间被认为是定义的,但是对其初始化完成的单元进行评估仍然是非法的。这就是为什么Type b = b
未定义的行为。
甚至定义变量的原因是你可以这样做:
struct X {
int *p;
int a;
};
X x = {&x.a, 123};
cout << *x.p << endl;
使用为其自身评估以外的目的而初始化的变量是合法的。在上面的示例中,x
的初始值设定项必须能够引用x
才能计算其a
成员的地址。这是合法的,因为a
本身未被评估(demo)。