Мне было интересно: если, например, std::endl
является обычной функцией, то почему ей не хватает оператора вызова ( operator()
)?
я знаю, что он предназначен для использования со вставкой (<<
) и извлечение (>>
) операторы. Я пытался назвать это так:
std::endl.();
Но, конечно, это не сработало.
std::endl
это просто обычная функция (или, скорее, шаблон функции), которую вы можете вызвать. Вы просто должны вызвать его с правильным аргументом:
std::endl(std::cout); // OK, equivalent to "std::cout << std::endl;"
Это потому что ostream
перегружает оператор сдвига для указателей функций способом, эквивалентным следующему:
ostream & operator<<(ostream & os, ostream & (*f)(ostream &))
{
return f(os);
}
(На самом деле это будет шаблон для basic_ostream
иметь дело с любыми чертами характера и распределителями.)
Других решений пока нет …