This question already has answers here:
Assigning Rvalue returned from function to another Rvalue
(2个答案)
4年前关闭。
为什么以下代码正确:
在这里,由于
(2个答案)
4年前关闭。
为什么以下代码正确:
struct A
{
A operator+( A const& elem )
{
return *this;
}
bool operator==( A const& elem )
{
return true;
}
operator bool()
{
return true;
}
};
int main()
{
A a_1, a_2;
if( ((a_1+a_2) = a_1) )
{}
}
在这里,由于
a_1 + a_2
是r值,所以我期望if语句出错。用A a_1, a_2;
替换int a_1, a_2;
行会导致预期的错误:error: expression is not assignable
if( ((a_1+a_2) = a_1) )
~~~~~~~~~ ^
1 error generated.
最佳答案
因为对于A
类,最后将(a_1+a_2) = a_1
解析为对A::operator=(const A&)
的调用。即使a_1+a_2
返回的内容是一个临时对象,对其调用成员函数仍然有效。
如果要禁止对临时对象进行此类调用,则可以使用ref-qualified member functions(自C++ 11起),可以用于区分调用的对象是l值还是r值。例如
struct A
{
//...
A& operator=(const A&) && = delete; // prevent from calling with temporary objects
A& operator=(const A&) & = default;
};
10-06 14:43