7

少し前に、2 項演算子を実装する通常のパターンmoveでは、戻り値に final が必要だと言われました。

Matrix operator+(const Matrix &a, Matrix &&b) {
    b += a;
    return std::move(b);
}

しかし今ではreturn、コンパイラが戻り値を一時的なものとして扱う可能性があるという特別な規則があり、これは必要ではなく、単純なものreturn bで十分です。

しかし、繰り返しますが、この関数にb名前があるため、LValueです。これは、コンパイラがそれを一時的であると見なすのを妨げており、move必要です。

これは、C++0x 標準の最新バージョンでも当てはまりますか? 上記のパターンを実装する必要がありますか?move

4

2 に答える 2

7

は不揮発性の自動オブジェクトの名前ではないstd::moveため、この例では明示的に指定する必要があります。参照 12.8 [class.copy] /p31/b1:b

  • クラスの戻り値の型を持つ関数の return ステートメントで、式が関数の戻り値の型と同じ cv- 非修飾型を持つ不揮発性自動オブジェクト (関数または catch-clause パラメーター以外) の名前である場合、自動オブジェクトを関数の戻り値に直接構築することにより、コピー/移動操作を省略できます
于 2011-08-21T20:04:51.110 に答える
0

この関数が値を返す理由がわかりません。この関数は次のような a を返すべきではありませんMatrix&&か?

Matrix&& operator+(const Matrix &a, Matrix &&b) {
  b += a;
  return std::move(b);
}

これには、最大で 1 つの一時を作成するという追加の利点がありx1 + x2 + x3 + ... + xnます。これは、Matrix がたまたまスタックに割り当てられた場合に重要です (移動から何も得られないため)。

署名は次のようにする必要があると思います。

Matrix&& operator+(Matrix &&a,      Matrix &&b     );
Matrix&& operator+(const Matrix &a, Matrix &&b     );
Matrix&& operator+(Matrix &&a,      const Matrix &b);
Matrix   operator+(const Matrix &a, const Matrix &b);
于 2011-08-22T02:08:28.563 に答える