This question already has answers here:
Assigning Rvalue returned from function to another Rvalue

(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