繁体   English   中英

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

[英]Why can't I call on the operator when I return by value instead of by reference?

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

/* 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)中,类似的对象通常支持move语义 ,这使得可以通过“ by move value”(这样称呼)传递此类对象。 但是,由于ostream只是基类,因此在ostream ,相应的构造函数受到保护,即无法从外部访问。 它只能在更特定的流类(例如ofstreamostringstream公开访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM