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