在计算其初始化值时是否认为变量已定义?

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。我可以得出结论,上面的定义由这些顺序步骤组成吗?

  1. b 声明为 Type
  2. 类型的变量
  3. 该变量的定义和初始化 0 默认值
  4. 对其新值的评估,其中包括变量本身(值为 0)
  5. 正在将新值赋给变量。

而且,变量是否总是初始化为 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).