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

Does the return type of the C++ stream insertion operator need to be an std::ostream?

本文关键字:std ostream 是否 插入 运算符 返回类型 C++      更新时间:2023-10-16

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

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

举个例子。。。

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

将尝试评估。。。

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

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