在计算初始化值时是否考虑了变量?

时间:2016-06-12 09:05:10

标签: c++ enums variable-declaration variable-initialization

这是我的小程序:

enum Type
{
    b = 1,
    c = 2
};

int main()
{
    Type b = b;
    std::cout << b << std::endl;

    return 0;
}

哪个输出0.我可以断定上面的定义是由这些连续的步骤组成的吗?

  1. 声明bType
  2. 类型的变量
  3. 使用0默认值
  4. 定义该变量并初始化
  5. 评估它的新值,包括变量本身(值为0)
  6. 将新值分配给变量。
  7. 并且,变量是否始终用0初始化,即使它们是显式初始化的?

    我的第二个问题是 - 如果它在指定示例中使用其中的变量初始化列表,为什么我不会得到有关歧义的错误?编译器是否首先尝试在变量列表中查找b,然后才检查声明的枚举?

2 个答案:

答案 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)。