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

时间:2015-06-29 11:57:40

标签: c++ operator-overloading ostream

以下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()
{
}

1 个答案:

答案 0 :(得分:5)

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

作为一个例子......

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

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

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

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