可分配的右值

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_2returns是一个临时对象,调用其上的成员函数仍然有效。

如果你想禁止对临时对象的此类调用,你可以使用 ref-qualified member functions (C++11 起),它可以用来区分调用的对象是左值还是右值.例如

struct A
{
  //...
  A& operator=(const A&) && = delete; // prevent from calling with temporary objects
  A& operator=(const A&) & = default;
};