【问题标题】:C++ return directly from operator<<C++ 直接从 operator<< 返回
【发布时间】:2021-02-12 23:13:23
【问题描述】:

发送到ostream时可以直接退货吗?

例如,不要写:

ostream& operator<<(ostream& os, Foo foo) {
    os << foo.a << foo.b;
    return os;
}

我可以直接写吗:

ostream& operator<<(ostream& os, Foo foo) {
    return os << foo.a << foo.b;
}

我试过了,它似乎有效,但我不知道这样做是否正确。做第二个版本有问题吗?

【问题讨论】:

  • 你用你的编译器试过了吗?
  • 是的,它似乎有效,但我不知道这样做是否正确
  • 在实现像您的示例这样非常简单的流运算符时,这是安全且非常正常的做法。
  • 之所以有效,是因为每个重载的流运算符都返回std::ostream&amp;。因此,return 之后的整个表达式返回 std::ostream&amp;。流操作符(实际上是operator&lt;&lt;)是左关联的。因此,os &lt;&lt; foo.a &lt;&lt; foo.b 被评估为((os &lt;&lt; foo.a) &lt;&lt; foo.b)
  • 为什么你认为它可能是错误的?如果您不添加为什么认为这是错误的,我们无法对此发表评论。

标签: c++ operator-overloading ostream


【解决方案1】:

您发布的两个代码 sn-ps 完全等效。

为什么?因为(为了论证,我在这里假设foo.afoo.b 是像int 这样的简单数据类型)&lt;&lt; operator for std::ostream 返回一个对自身的引用(参见链接文档中的“返回值”部分)。

因此,在您的第一个代码 sn-p 中,return os; 行返回对第一个参数引用的 os 对象的引用。在您的第二个 sn-p 中,两个 &lt;&lt; 操作各自评估为对同一对象的引用......所以您返回的是对 exact same 对象的引用。

为了使第二个版本更清晰,您可能希望将返回的表达式括在括号中:

ostream& operator<<(ostream& os, Foo foo) {
    return (os << foo.a << foo.b);
}

【讨论】:

    【解决方案2】:

    发送到ostream时是否允许直接返回?

    是的,这是允许的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-06
      • 2021-02-24
      • 1970-01-01
      • 2020-08-04
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多