【发布时间】:2013-04-20 00:29:33
【问题描述】:
考虑以下代码:
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 而不是一个右值引用),但是如果有人编写上面的代码,我认为这是一个使用错误,因为代码看起来像是在自找麻烦。是否有任何“规范”真实世界的示例,其中上述运算符返回右值引用是一个问题?为什么我应该始终从运算符返回右值,有什么令人信服的理由?
【问题讨论】:
-
Defect report 1138也提出了这个问题。
标签: c++ c++11 operator-overloading rvalue-reference