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

时间:2013-10-06 04:46:00

标签: 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;

}

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

1 个答案:

答案 0 :(得分:7)

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

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

首先,ostream本质上是一个抽象类,旨在用作实现更具体类(如ofstreamostringstream)的通用功能的基类。 ostream类的对象本身不完整且无法使用。复制这些对象没有任何意义 - 它只是将对象切片。

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

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