次のコードを検討してください。
struct MyString
{
// some ctors
MyString& operator+=( const MyString& other ); // implemented correctly
};
MyString operator+( const MyString& lhs, const MyString& rhs )
{
MyString nrv( lhs );
nrv += rhs;
return nrv;
}
MyString&& operator+( MyString&& lhs, const MyString& rhs )
{
lhs += rhs;
return std::move( lhs ); // return the rvalue reference we received as a parameter!
}
これは、次のユースケースで機能します
MyString a, b, c; // initialized properly
MyString result = a + b + c;
しかし、それはぶら下がり参照を作成します
const MyString& result = a + b + c;
これで、その理由と修正方法 (右辺値参照の代わりに ravlue を返す) は理解できましたが、コードがトラブルを求めているように見えるため、誰かが上記を書いた場合は使用エラーと見なします。上記の演算子が右辺値参照を返すことが問題になる「標準的な」実世界の例はありますか? 演算子から常に右辺値を返す必要がある説得力のある理由は何ですか?