gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:02 24 4
gpt4 key购买 nike

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

/* 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 本质上是一个抽象类,旨在作为基类为更具体的类(如 ofstreamostringstream)实现通用功能>。 ostream 类的对象本身是不完整且无法使用的。复制此类对象没有任何意义 - 它只会对对象进行切片。

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

在现代 C++ (C++11) 中,像这样的对象通常支持移动语义,这使得可以“按移动值”(让我们这样调用它)传递此类对象。但是由于 ostream 只是一个基类,在 ostream 中相应的构造函数是 protected ,即它不能从外部访问。它只能在更具体的流类中公开访问,例如 ofstreamostringstream

关于c++ - 当我按值而不是按引用返回时,为什么不能调用运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com