4

一般に、この議論はローカル関数変数のみです。

void foo (const int &i)
{
  // use i till foo() ends
}
foo(3);

しかし、このルールはclassメンバーにも適用されますか?

struct A {
  const int &a;
  A () : a(3) {}  // version 1
  A (const int &i) : a(i) {} // version 2
};

現在Aは、

{
  return ()? new A : new A(3) : new A(some_local_variable);
}

内容は 、割り当てられた 3 つの lyすべての有効期間を通じてa 同じままになりますか? newA

4

2 に答える 2

3

C++03 標準 (セクション「12.2/5 一時オブジェクト」 ) は、あなたの質問に適切に答えます。

参照がバインドされている一時オブジェクト、または一時オブジェクトがバインドされているサブオブジェクトへの完全なオブジェクトである一時オブジェクトは、以下に指定されている場合を除き、参照の存続期間中存続します。コンストラクターの ctor-initializer (12.6.2) の参照メンバーへの一時的なバインドは、コンストラクターが終了するまで持続します。関数呼び出し (5.2.2) の参照パラメーターへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続します。

于 2011-07-16T05:06:15.800 に答える
2

を使用してオブジェクトを割り当てた場合、そのオブジェクトnewは永久にメモリに残りますdelete。一時的なオブジェクトではありません。

aのメンバーでAあり、割り当ての一部です。

編集:コメントをありがとう。私は言います - いいえ、これは正しくありません。このことを考慮:

struct A {
  const int &a;
  A () : a(3) {}  // version 1
  A (const int &i) : a(i) {} // version 2
};

void foo() {
  A *pA;

  {
     int x;
     pA = new A(x);
  }

  // Now pA->a is pointing to the address where `x` used to be,
  // but the compiler may very well put something else in this place now
  // because x is out of scope.
}

Aオブジェクトの存続期間が複数の関数にまたがる場合、答えはより明白になります。

補足: 「コンテンツ」という言葉は、ここでは少しあいまいです。参照をポインターと同一視するため、a基本的に整数を指しています。const であろうとなかろうと、整数が存在しなくなった場合 (スタック上にあり、削除されたため)、aメモリ内の同じアドレスを指している間、別のものを参照しています。GotW の記事は、参照によって指されているオブジェクトの寿命を延ばすコンパイラについて話しているようです。参照自体も単なるポインターです。

于 2011-07-16T04:44:38.503 に答える