在计算其初始化值时是否认为变量已定义?
Are variables considered defined while calculation of their initialization value?
这是我的小程序:
enum Type
{
b = 1,
c = 2
};
int main()
{
Type b = b;
std::cout << b << std::endl;
return 0;
}
哪个输出 0。我可以得出结论,上面的定义由这些顺序步骤组成吗?
- 将
b
声明为 Type
类型的变量
- 该变量的定义和初始化
0
默认值
- 对其新值的评估,其中包括变量本身(值为 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
本身没有计算 (demo).
这是我的小程序:
enum Type
{
b = 1,
c = 2
};
int main()
{
Type b = b;
std::cout << b << std::endl;
return 0;
}
哪个输出 0。我可以得出结论,上面的定义由这些顺序步骤组成吗?
- 将
b
声明为Type
类型的变量
- 该变量的定义和初始化
0
默认值 - 对其新值的评估,其中包括变量本身(值为 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
本身没有计算 (demo).