Хорошо известно, что пользователь может определять манипуляторы потоков следующим образом:
ostream& tab(ostream & output)
{
return output<< '\t';
}
И это можно использовать в main() следующим образом:
cout<<'a'<<tab<<'b'<<'c'<<endl;
Пожалуйста, объясните мне, как это все работает? Если оператор < принимает в качестве второго параметра указатель на функцию, которая принимает и возвращает ostream &, то, пожалуйста, объясните, почему это необходимо? Что было бы неправильно, если функция не принимает и возвращает ostream &, но она была недействительной вместо ostream &?
Также интересно, почему манипуляторы "dec", "hex" вступают в силу до тех пор, пока я не изменюсь между ними, но пользовательские манипуляторы должны всегда использоваться для вступления в силу для каждой потоковой передачи?