给出以下错误:
class B {
private:
int n;
public:
B(int x) :
n(x) {
}
B operator+(B& b) {
return B(n + b.n);
}
friend ostream& operator<<(ostream &out, const B& b) {
out << "B: " << b.n;
return out;
}
bool operator<(const B& rhs) const {
return n < rhs.n;
}
};
int main() {
B b1(2);
B b2(3);
B res121 = b1 + (b2 + b1); // ----error
B res21 = b2 + b1;
B res1_21 = b1 + res21; // ---- No error
cout << res1_21;
return 0;
}
为什么在尝试定义res121
时出现错误,而在尝试定义res1_21
时却没有错误?
毕竟,b2+b1
是B
类型的对象,那么问题是什么?就是说a temporary object
,我怎么知道什么是temporary object
,什么不是。
答案 0 :(得分:10)
C ++术语中的临时对象是没有名称或标识的对象,通常不作为函数的返回值而存在。它们的工作方式在c++11和c++17之间完全改变。
它们的存在在当前完整表达式(通常是;
)的结尾处结束,并且它们无法绑定到非const
左值引用,因此B&
无法绑定到临时
此:
B operator+(B& b) {
return B(n + b.n);
}
是可怜的operator+
。编写operator+
的最佳 1 方法是:
B& operator+=(B const& b)& {
n += b.n;
return *this;
}
friend B operator+(B lhs, B const& rhs) {
lhs += rhs;
return lhs;
}
在其中将+=
实现为成员函数,然后编写根据friend
实现的稍微不对称的operator+
+=
。
+
中的不对称使得+
表达式的长链效率更高,尤其是在实现便宜的对象的情况下。
1 自然,在某些情况下这不是最好的。有时像真实的表达模板。但是您应该从此开始,只有在证明自己需要时才变得更加复杂。