1

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

/* 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;

}

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

4

1 回答 1

7

因为ostream是不可复制的对象。返回“按值”意味着返回一个副本。标准ostream类没有可访问的复制构造函数,这就是无法复制ostream对象的原因。

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

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

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

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

于 2013-10-06T04:48:17.270 回答