
176
|
5 章 右辺値参照、ムーブセマンティクス、完全転送
return 文内で lhs を右辺値へキャストすることにより(std::move)、lhs はメモリ上で関数の
戻り値の位置へムーブされます。ここで仮に std::move 呼び出しをなくしてしまうと、次のように
なります。
Matrix // as above
operator+(Matrix&& lhs, const Matrix& rhs) 先の例と同様
{
lhs += rhs;
return lhs; // copy lhs into
} // return value
lhs を戻り値へコピー
lhs は左辺値となり、コンパイラは戻り値の位置へコピーせざるを得ません。Matrix 型が、コ
ピーコンストラクトよりも効率に優れるムーブコンストラクトに対応していれば、return 文内で
std::move を実行し、効率的なコードを生成できます。
Matrix がムーブ対応していなくとも、Matrix のコピーコンストラクタが右辺値を単純にコピー
するため、右辺値へのキャストが害になることはありません(項目 23 を参照)。仮に Matrix がそ
の後ムーブに対応すれば、operator+ は次回コンパイル時に自動的にその恩恵を受けられます。そ
のため値戻しする関数から戻される右辺値参照に std::move を実行しても、何も失うものはありま
せん(得るものがある可能性は大いにある)。
ユニヴァーサル参照と std::forward の