可分配的右值
Assignable r-value
为什么下面的代码是正确的:
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) )
{}
}
在这里,我预计 if 语句会出错,因为 a_1 + a_2
是一个右值。将行 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.
因为对于 class A
,(a_1+a_2) = a_1
最后将被解析为对 A::operator=(const A&)
的调用。即使a_1+a_2
returns是一个临时对象,调用其上的成员函数仍然有效。
如果你想禁止对临时对象的此类调用,你可以使用 ref-qualified member functions (C++11 起),它可以用来区分调用的对象是左值还是右值.例如
struct A
{
//...
A& operator=(const A&) && = delete; // prevent from calling with temporary objects
A& operator=(const A&) & = default;
};
为什么下面的代码是正确的:
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) )
{}
}
在这里,我预计 if 语句会出错,因为 a_1 + a_2
是一个右值。将行 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.
因为对于 class A
,(a_1+a_2) = a_1
最后将被解析为对 A::operator=(const A&)
的调用。即使a_1+a_2
returns是一个临时对象,调用其上的成员函数仍然有效。
如果你想禁止对临时对象的此类调用,你可以使用 ref-qualified member functions (C++11 起),它可以用来区分调用的对象是左值还是右值.例如
struct A
{
//...
A& operator=(const A&) && = delete; // prevent from calling with temporary objects
A& operator=(const A&) & = default;
};