【发布时间】: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 << foo1 << foo2;使用您的运算符,这将有奇怪的效果。 -
可能唯一有用的方法是强制你只能在
Foo之后写一个Bar,方法是从operator<<(ostream&, Foo)返回一个包装器ostream_expect_Bar并使用它在std::ostream& (ostream_expect_Bar, Bar)。因此std::cout << Foo() << Bar() << std::endl是合法的,但如果省略Foo或Bar,您就会遇到问题。
标签: c++ operator-overloading ostream