5

これは私の小さなプログラムです:

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

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

    return 0;
}

上記の定義は、この一連のステップで構成されていると結論付けることができますか?

  1. b型の変数としての宣言Type
  2. その変数の定義と0デフォルト値での初期化
  3. 変数自体を含む新しい値の評価 (値 0)
  4. その新しい値を変数に割り当てます。

また、明示的に初期化されている場合でも、変数は常に 0 で初期化されますか?

私の2番目の質問は、指定された例の初期化リストで変数を使用している場合、あいまいさに関するエラーが発生しないのはなぜですか? bコンパイラは最初に変数リストを見つけようとしていて、宣言された列挙型をチェックしていますか?

4

2 に答える 2

7

ステップ 1 は正しいですが、残りは間違っています。何が起こるかというと、変数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参照できる必要があります。それ自体は評価されない ( demo )ため、これは正当です。xaa

于 2016-06-12T09:26:56.030 に答える