【问题标题】:Does the return type of the C++ stream insertion operator need to be an std::ostream?C++流插入运算符的返回类型是否需要是std::ostream?
【发布时间】:2015-09-15 21:09:32
【问题描述】:

下面的 code 包含 operator<< 的重载,在 MSVC 2008 和 gcc 4.6.3 上编译。合法吗?

#include <iostream>

struct Foo
{
    friend Foo operator<<( std::ostream& stream , Foo& foo );
    Foo operator<<( std::ostream& stream )
    {
        return *this;
    }
};

Foo operator<<( std::ostream& stream , Foo& foo )
{
    return foo;
}

int main()
{
}

【问题讨论】:

  • 这是合法的。现在尝试使用它。
  • Afaik,运算符可以返回任何内容,但通常插入运算符会再次返回流(在将第二个参数传递给它之后),以便您可以链接它们:stream &lt;&lt; foo1 &lt;&lt; foo2; 使用您的运算符,这将有奇怪的效果。
  • 可能唯一有用的方法是强制你只能在Foo之后写一个Bar,方法是从operator&lt;&lt;(ostream&amp;, Foo)返回一个包装器ostream_expect_Bar并使用它在std::ostream&amp; (ostream_expect_Bar, Bar)。因此std::cout &lt;&lt; Foo() &lt;&lt; Bar() &lt;&lt; std::endl 是合法的,但如果省略FooBar,您就会遇到问题。

标签: c++ operator-overloading ostream


【解决方案1】:

是的,在改变返回类型的同时重载 operator&lt;&lt; 是完全合法的 - 对于将您的类型与其他类型一起流式传输到 C++ 流的常见用途,它无法正常工作。

举个例子……

Foo my_foo;
std::cout << my_foo << '\n';

...将尝试评估...

operator<<(std::cout, my_foo).operator<<(std::ostream& ??? '\n' ???)

...'\n' 不是Foo::operator&lt;&lt;(std::ostream&amp;) 可接受的参数,因此会出现编译错误。

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2011-11-27
    • 2017-06-17
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多