分配给rvalue:为什么要编译?

时间:2015-11-18 15:29:09

标签: c++ reference lvalue rvalue

在以下示例中:

class A {
  private: double content;

  public:
  A():content(0) {}

  A operator+(const A& other) {     
    content += other.content;
    return *this;
  }

 void operator=(const A& other) {
       content = other.content;
  }

};

A是double的简单包装器,+=运算符已经过载。在以下用途中:

 int main(int argc, char *argv[]) {
    A a, b, c;
    (a+b) = c ; // Why is this operation legal?
}

为什么(a+b) = c会编译?我想知道为什么这句话是合法的,因为(a+b)的结果必须是rvalue。我没有从operator+返回引用。

1 个答案:

答案 0 :(得分:12)

(a+b) = c(a+b).operator=(c)相同。赋值运算符中的rvalue引用没有特殊规则,它只遵循通常的函数调用规则。如果要阻止使用rvalues调用,可以添加ref-qualifier:

void operator= (const A& other) & {
//                              ^
     content = other.content;
}

这只允许在左值上调用函数。