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