在以下示例中:
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+
返回引用。
答案 0 :(得分:12)
(a+b) = c
与(a+b).operator=(c)
相同。赋值运算符中的rvalue引用没有特殊规则,它只遵循通常的函数调用规则。如果要阻止使用rvalues调用,可以添加ref-qualifier:
void operator= (const A& other) & {
// ^
content = other.content;
}
这只允许在左值上调用函数。