std::endl
- это объявленный шаблон функции (27.7.3.8):
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
Причина, по которой вы можете "передать" его на std::cout
, заключается в том, что шаблон класса basic_ostream
имеет членобъявлено:
basic_ostream<charT,traits>& operator<<
( basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&) );
, что определено как результат возврата pf(*this)
(27.7.3.6.3).
std::endl
без скобок относится к набору функций перегрузки -все возможные специализации шаблона функции, но используемые в контексте, где указатель функции одного конкретного типа является приемлемым (то есть в качестве аргумента для operator<<
), правильная специализация может быть однозначно выведена.