0

RVO と NRVO が新しい C++11 移動演算子と共にどのように機能するかを理解しようとしています。いくつかの例を含むダミー クラスを起草しました。

編集: コードの最も重要な部分のみが表示されます。

完全なソース コードはこちらから入手できます。

クラスを参照として取得し、値または参照を返す 2 つの関数があります。

VOpt& fChangeClassRetRef(VOpt &m) {
    m.setX(21);
    return m;
}

VOpt fChangeClassRetValue(VOpt &m) {
    m.setX(21);
    return m;
}

これらの関数を呼び出すと、出力として次のようになります。

VOpt &m14 = fChangeClassRetRef(m13);

m14 = fChangeClassRetRef(m11);
     -> Copy Assignment Operator

m14 = fChangeClassRetValue(m11);
     -> Copy Constructor
     -> C++11 Move Operator

左辺値参照が使用されている場合、コピー コンストラクターは呼び出されません。それ以外の場合、それらの関数 (パラメーターとして参照を受け取る) は引き続きコピー コンストラクターを呼び出します。

この機能はコンパイラに依存していますか? 私は何か間違ったことをしていますか?

4

2 に答える 2

3
m14 = fChangeClassRetRef(m11);
     -> Copy Assignment Operator

関数は参照 (左辺値) を返します。引数が右辺値ではないため、移動代入を実行できません。

m14 = fChangeClassRetValue(m11);
     -> Copy Constructor
     -> C++11 Move Operator

コピー コンストラクターは内部的にトリガーされ、戻り値を作成します。引数は参照 (左辺値) であるため、移動コンストラクターではなく、コピー コンストラクターである必要があります。戻り値の代入ではm14、引数が右辺値であるため、移動代入演算子が使用されます。

于 2013-12-03T16:28:23.477 に答える