这两种情况有什么区别?我怎么知道什么是临时对象?

时间:2018-07-09 14:48:43

标签: c++ c++11

给出以下错误:

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+b1B类型的对象,那么问题是什么?就是说a temporary object,我怎么知道什么是temporary object,什么不是。

1 个答案:

答案 0 :(得分:10)

C ++术语中的临时对象是没有名称或标识的对象,通常不作为函数的返回值而存在。它们的工作方式在之间完全改变。

它们的存在在当前完整表达式(通常是;)的结尾处结束,并且它们无法绑定到非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 自然,在某些情况下这不是最好的。有时像真实的表达模板。但是您应该从此开始,只有在证明自己需要时才变得更加复杂。