当我按值而不是按引用返回时,为什么不能调用运算符?

Kac*_*acy 1 c++ operator-overloading return-value

如果我通过引用返回,此代码将起作用.我的问题是为什么我不能按价值回报?

/* Boss is a struct I defined, but is literally empty */

ostream operator<<( ostream & speak, Boss y ) {

  speak << "We need more profit!" << endl;
  return speak;

}

int main() {

  Boss b;
  cout << b << endl;

}
Run Code Online (Sandbox Code Playgroud)

我猜测可能是因为你不能用临时对象调用函数,但我以前用临时对象调用了函数.这是运营商特有的吗?

AnT*_*AnT 7

因为ostream是不可复制的对象.返回"按值"表示返回副本.标准ostream类没有可访问的复制构造函数,这就是无法复制ostream对象的原因.

这是故意完成的,特别是为了防止您复制ostream对象.它至少有两个原因.

首先,ostream本质上是一个抽象类,旨在作为基类实现更具体的类(如ofstream或更多)的通用功能ostringstream.ostream类的对象本身是不完整和不可用的.复制这些对象没有任何意义 - 它只是切片对象.

其次,当一个对象拥有某些外部资源的独占所有权时,如输入输出流,复制这样的对象也意味着复制该外部资源.在许多情况下,它在物理上是不可能的(例如,程序只能有一个标准输出流).但即使有可能,使简单的复制构造函数调用变得简单仍然不是一个好主意.

在现代C++(C++ 11)中,像这样的对象通常支持移动语义,这使得可以通过"移动值"传递这些对象(让我们称之为).但由于ostream它只是一个基类,所以在ostream相应的构造函数中受到保护,即它无法从外部访问.它只能在更具体的流类中公开访问,例如ofstreamostringstream.