2015-06-29 2 views
1

Следующие 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() 
{ 
} 
+1

Это законно. Теперь попробуйте использовать его. – juanchopanza

+1

Afaik оператор может возвращать что-либо, но обычно оператор вставки возвращает снова поток (после передачи ему второго параметра), чтобы вы могли их связать: 'stream << foo1 << foo2;' С вашим оператором это будет имеют странные последствия. – user463035818

+0

Вероятно, единственным способом, в котором это было бы полезно, является принуждение к тому, что вы можете писать «Bar» только после 'Foo', возвращая оболочку' ostream_expect_Bar' из 'operator << (ostream &, Foo)' и потребляя это в 'std :: ostream & (ostream_expect_Bar, Bar)'. Таким образом, 'std :: cout << Foo() << Bar() << std :: endl' является законным, но опускает« Foo »или« Bar », и у вас есть проблема. – MSalters

ответ

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&), так что вы Появится ошибка компиляции.

 Смежные вопросы

  • Нет связанных вопросов^_^