Как работают манипуляторы потоков?

Хорошо известно, что пользователь может определять манипуляторы потоков следующим образом:

ostream& tab(ostream & output)
{
    return output<< '\t';
} 

И это можно использовать в main () вот так:

cout<<'a'<<tab<<'b'<<'c'<<endl;

Объясните, пожалуйста, как все это работает? Если operator << предполагает в качестве второго параметра указатель на функцию, которая принимает и возвращает ostream & , тогда, пожалуйста, объясните, почему это необходимо? Что будет неправильным, если функция не принимает и не возвращает ostream & , но это было void вместо ostream & ?

Также интересно, почему манипуляторы «dec» и «hex» действуют до тех пор, пока я не переключаюсь между ними, но всегда следует использовать определенные пользователем манипуляторы, чтобы они вступили в силу для каждой потоковой передачи?

20
задан Kara 7 August 2015 в 17:44
поделиться