2

次のコードがありますが、なぜゴミではなく「22」と書き出すのか疑問に思っています

class example
{

public:

    example(int ea) : ref(ea)
    {
    }

    int& ref;
};

int main ()
{
    example obj(22);

    cout << obj.ref; // Writes out 22

    return 0;
}

私はこれが起こるべきだと思います:

  • obj(22) は、22 を一時的な整数に暗黙的に変換します。
  • 整数は int ea パラメータにコピーされます
  • ref は ea パラメータへの参照で初期化されます
  • ea パラメータが破棄されます

なぜ参照がまだ有効なのですか?

4

3 に答える 3

5

簡単な答え: 有効ではありません。たまたま機能するだけです。

長い答え: イベントの順序は正しいです。参照は、(コンストラクターの最後で) スコープ外になった変数を指しています。そのため、これはダングリング リファレンスです。その時点からその参照を使用すると、未定義の動作が発生します。この場合、たまたま値が出力されますが、それ以外のことも簡単に実行できます。

于 2013-04-02T17:33:56.353 に答える
3

参照はまだ有効ではなく、参照先のメモリにアクセスすると、未定義の動作が発生します。たまたま、値が 22 の整数を格納していたが、まだ再利用されていないメモリを参照しているとします。

于 2013-04-02T17:34:56.060 に答える
2

その未定義の動作。

次のコードを試して違いを確認してください。

example obj(22);
example obj2(33);
example obj3(44);

cout << obj.ref; // <-- writes out 44 instead of 22
于 2013-04-02T17:38:47.257 に答える