C++流插入运算符的返回类型是否需要是std :: ostream?

Olu*_*ide 1 c++ operator-overloading ostream

以下代码包含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()
{
}
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 5

是的,operator<<在改变返回类型时重载是完全合法的- 它只是不能正常使用将类型与其他类型一起流式传输到C++流.

举个例子...

Foo my_foo;
std::cout << my_foo << '\n';
Run Code Online (Sandbox Code Playgroud)

......将进行评估......

operator<<(std::cout, my_foo).operator<<(std::ostream& ??? '\n' ???)
Run Code Online (Sandbox Code Playgroud)

...这'\n'不是一个可接受的参数Foo::operator<<(std::ostream&),因此您将收到编译错误.