5

这是我的小程序:

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在变量列表中查找,然后才检查声明的枚举?

4

2 回答 2

7

第一步是正确的,但其余的都是错误的。发生的情况是变量b被定义并立即初始化为变量的值b。这会导致未定义的行为,因为b在它自己的初始化中使用之前没有初始化。

如果要将其初始化为,Type::b则需要显式编写:

Type b = Type::b;
于 2016-06-12T09:11:12.027 回答
1

尽管该变量被认为是在其自身初始化期间定义的,但以它的初始化完成为单位对其进行评估仍然是非法的。这就是Type b = b未定义行为的原因。

甚至定义变量的原因是您可以这样做:

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

将被初始化的变量用于其自身评估以外的目的是合法的。x在上面的示例中,必须能够引用的初始化程序x才能计算其a成员的地址。这是合法的,因为a它本身没有被评估(demo)。

于 2016-06-12T09:26:56.030 回答