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

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

}

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

最佳答案

因为 ostream 是一个不可复制的对象。 “按值”返回意味着返回拷贝。标准 ostream 类没有可访问的复制构造函数,这就是为什么无法复制 ostream 对象的原因。

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

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

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

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

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

相关文章:

c++ - 编程 VPN,身份验证阶段 - RFC 不够清楚

c++ - Mac 上体系结构 x86_64 c++ 的 undefined symbol

C#函数返回数组

c++ - 如何从另一个类访问已经声明的类?

c++ - 我需要赋值运算符回来

c++ - 为 std::strings 重载运算符+ - 一个坏主意?

c++ - 使用 << 运算符同时写入文件和 cout

jquery - 从函数内部的函数返回值

xml - 如何使用xpath从节点获取属性值?

c++ - 终止工作线程的正确方法