考虑以下代码:
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 而不是一个右值引用),但是如果有人编写上面的代码,我认为这是一个使用错误,因为代码看起来像是在自找麻烦。是否存在上述返回右值引用的运算符存在问题的“规范”真实世界示例?为什么我应该始终从运算符返回右值,有什么令人信服的理由?