0

次のコードがあります

class A {
   A(int & r)
   : i(r)
   {}

   A(A&& obj)
   : i(obj.i)
   {}

   operator=(A&& obj)
   {
     // ?
   }

   int& i;
}

そして、次のメインを想像してください

int main()
{
   int r = 12;
   int r2 = 21;
   A a(r);
   A b(r2);

   b = std::move(a);
   r = 42;
   std::cout << "b.i value is " << b.i << std::endl;
}

私はそれを印刷したいと思いますb.i value is 42

要するに、iで参照するように改変することobj.iは可能operator=()でしょうか?

4

2 に答える 2

3

短い答えはいいえです。

答えが「いいえ」である理由を理解するには、リファレンスとは何かを理解する必要があります。参照はポインターではありません。実際、参照はオブジェクトではありません。メモリ内の別の場所の単なるエイリアスです。標準では、実際には、参照はアドレスを持たない (必要がない) ため、メモリ内に存在する必要さえないと述べています。ご存じのとおり、参照は (多くの場合) コンパイル時に完全に消える可能性があります。

参照変数を指定すると、それを使用して参照自体を参照することはできません。その名前を使用すると、それが参照するメモリの場所を参照します。これが、参照へのポインターを作成できない理由です。つまり、参照のアドレスを取得することはできません。前述のように、アドレスさえない場合があるため、これは良いことです。

そのため、必ずしもメモリ内に場所があるとは限らず、その値 (それが参照するものの値のみ) を参照できないことを考えると、参照自体の「値」を変更することはできません。これが、C++03 で定数参照 ( ) を作成しようとするとエラーになる理由T& constです。(ただし、C++11 では、右辺値参照を導入するときに必要な参照の崩壊により、これが許可されます)

于 2013-01-16T11:11:35.927 に答える
0

コンストラクターが呼び出された後にOperator=が呼び出され、参照フィールドを初期化しないままにすることはできません。クラスのコンストラクターで設定する必要があります。したがって、答えはノーです。代わりに、ポインターまたはスマートポインターを使用してください。

于 2013-01-16T10:56:48.700 に答える