1

foo関数を考える

void foo(X x);

X行列cass、および関数

X foobar();

私が走るとしましょう

foo(foobar());

この場合、段階的に一時オブジェクトはどうなりますか? 私の理解は、

  1. foobarたとえば、一時オブジェクトを返しますXtemp1
  2. fooXtemp1それ自体の一時的なオブジェクトにコピーし、たとえばXtemp2を破棄してから破棄しXtemp1ます。
  3. fooで計算を実行しXtemp2ます。

反対に、次のようにオーバーロードfooすると

void foo(X& x);
void foo(X&& x);

その場合、写真は異なります。特に、

  1. foobar一時を返しますXtemp1
  2. foo新しい一時を作成しませんが、Xtemp1その参照を通じて直接作用します。

この図は正しいですか、そうでない場合は、誰かが指摘して私の間違いを修正してもらえますか? どうもありがとうございました。

4

2 に答える 2

1

あなたの理解はほぼ正しいです。唯一の違いは、手順 2. では、一時Xtemp1が任意の名前の一時にコピーされるのではなく、 (宣言から)Xtemp2仮パラメーターのスペースにコピーされることです。xfoo(X x)

また、コピー省略が発生する可能性があります。これは、 の戻り値がの仮パラメーター のfoobar()空間で直接構築されることを意味する可能性があるため、コピーは発生しません。これは標準で許可されていますが、保証されていません。foox

r値参照ケースに対するあなたの見方は正しいです。

于 2013-05-14T08:19:58.393 に答える