运算符使用ostream和链接进行重载.为何选择返回?

use*_*956 3 c++ ostream operator-keyword

对此有很多问题和答案,但我无法真正找到为什么我们需要通过引用返回.

如果我们有(假设运算符已经为对象MyObject正确重载):

    MyObject obj1;
    MyObject obj2;
    cout << obj1 << obj2;
Run Code Online (Sandbox Code Playgroud)

现在,会有像((cout << obj1)<< obj2))这样的子表达式; 问题是为什么我们不能以价值回报?(好吧,我们假设它允许返回ostream作为值)如果cout << obj1返回一个流对象而不是一个引用,有什么区别?为什么链接不可能呢?就像'='运算符的重载一样,如果按值返回,我们就不能像A = B = C = D那样链.为什么?


谢谢你的回答.我意识到我可以通过引用链接而不返回,但是当重载'='时我的输出完全不同.如果我写:

    class Blah{
    public:
       Blah();
       Blah(int x, int y);
       int x;
       int y;
       Blah operator =(Blah rhs);
     };
     Blah::Blah(){}
     Blah::Blah(int xp, int yp){
       x = xp;
       y = yp;
     }
     Blah Blah::operator =(Blah rhs){
       Blah ret;
       ret.x = rhs.x;
       ret.y = rhs.y;
       return ret;
     }
    int main(){

      Blah b1(2,3);
      Blah b2(4,1);
      Blah b3(8,9);
      Blah b4(7,5);
      b3 = b4 = b2 = b1;
      cout << b3.x << ", " << b3.y << endl;
      cout << b4.x << ", " << b4.y << endl;
      cout << b2.x << ", " << b2.y << endl;
      cout << b1.x << ", " << b1.y << endl;
          return 0;
     }
Run Code Online (Sandbox Code Playgroud)

其结果是:8,9 7,5 4,1 2,3

但是,如果我通过引用返回重载并将参数设置为引用,并在重载时修改并返回*this,我得到:2,3 2,3 2,3 2,3

在第一个例子中没有对象被改变的原因是什么?是因为左值与右值?比较速记运营商怎么样?


好的,另一个更新.如上所述,正确的结果应该是2,3.但是,如果我将重载运算符写为:

     Blah Blah::operator =(Blah rhs){
       x = rhs.x;
       y = rhs.y;
       return *this;
     }
Run Code Online (Sandbox Code Playgroud)

然后,我会得到正确的结果.(2,3 2,3 2,3 2,3).*这会怎么样?重载的运算符在重载函数中用rhs更新lhs,但返回*这似乎没有意义.*最终在哪里:b3 = b4 = b2 = b1?它是否会尝试返回左侧,以便当链达到b3时它实际上不会返回任何内容(这将尝试返回到左侧)?

Jam*_*nze 6

主要原因是因为按值返回会生成副本,而iostream对象不可复制.它们具有状态和标识,并且不清楚复制它们应该意味着什么:对象包含(逻辑上,至少)它在流中的位置,所以如果我创建一个副本,我有两个对象将写在同一位置流.