如果我通过引用返回,此代码将起作用。我的问题是为什么我不能按价值回报?
/* 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;
}
我的猜测是,可能是因为你不能用临时对象调用函数,但我以前用临时对象调用了函数。这是运营商特有的吗?
答案 0 :(得分:7)
因为ostream
是不可复制的对象。返回“按值”表示返回副本。标准ostream
类没有可访问的复制构造函数,这就是无法复制ostream
个对象的原因。
这是故意完成的,特别是为了防止您复制ostream
个对象。它至少有两个原因。
首先,ostream
本质上是一个抽象类,旨在用作实现更具体类(如ofstream
或ostringstream
)的通用功能的基类。 ostream
类的对象本身不完整且无法使用。复制这些对象没有任何意义 - 它只是将对象切片。
其次,当一个对象拥有某些外部资源的独占所有权时,如输入输出流,复制这样的对象也意味着复制该外部资源。在许多情况下,它在物理上是不可能的(例如,程序只能有一个标准输出流)。但即使有可能,制作简单的复制构造函数调用仍然不是一个好主意。
在现代C ++(C ++ 11)中,像这样的对象通常支持移动语义,这使得可以将这些对象传递给“移动值”(让我们称之为)。但由于ostream
只是一个基类,因此ostream
中相应的构造函数受到保护,即无法从外部访问。它只能在更具体的流类中公开访问,例如ofstream
或ostringstream
。