Следующие code, содержащие перегрузки operator<<
, компилируются на MSVC 2008 и gcc 4.6.3. Это законно?Должен ли тип возврата оператора вставки потока C++ быть std :: ostream?
#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()
{
}
Это законно. Теперь попробуйте использовать его. – juanchopanza
Afaik оператор может возвращать что-либо, но обычно оператор вставки возвращает снова поток (после передачи ему второго параметра), чтобы вы могли их связать: 'stream << foo1 << foo2;' С вашим оператором это будет имеют странные последствия. – user463035818
Вероятно, единственным способом, в котором это было бы полезно, является принуждение к тому, что вы можете писать «Bar» только после 'Foo', возвращая оболочку' ostream_expect_Bar' из 'operator << (ostream &, Foo)' и потребляя это в 'std :: ostream & (ostream_expect_Bar, Bar)'. Таким образом, 'std :: cout << Foo() << Bar() << std :: endl' является законным, но опускает« Foo »или« Bar », и у вас есть проблема. – MSalters