例えば:
Beta_ab&& Beta::toAB() const {
return move(Beta_ab(1, 1));
}
ベストアンサー1
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
これは、lvalue 参照の場合と同様に、ぶら下がり参照を返します。関数が戻った後、一時オブジェクトは破棄されます。Beta_ab
次のように、値で返す必要があります。
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
これで、一時オブジェクトが関数の戻り値に適切に移動されましたBeta_ab
。コンパイラが可能な場合は、RVO (戻り値最適化) を使用して移動を完全に回避します。これで、次の操作を実行できます。
Beta_ab ab = others.toAB();
そして、一時的なものを に移動するab
か、RVOを実行して移動やコピーをまったく行わないようにする。BoostCon09 右辺値参照 101これは問題を説明し、(N)RVO がこれとどのように相互作用するかを説明します。
右辺値参照を返すというあなたのケースは、他の場合にも良いアイデアでしょう。getAB()
一時変数で頻繁に呼び出す関数があるとします。右辺値の一時変数に対して const 左辺値参照を返すようにするのは最適ではありません。次のように実装できます。
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
この場合は、ローカル自動値でも一時右辺値でもないmove
ため、オプションではないことに注意してください。ab
参照修飾子 &&
2番目の関数は右辺値の一時変数に対して呼び出され、コピーの代わりに次の移動を行う。
Beta_ab ab = Beta().getAB();