E 'il modo in cui i manipolatori del flusso di lavoro. I manipolatori sono funzioni che passano all'operatore < < come argomenti. Quindi all'interno dell'operatore vengono semplicemente chiamati.
in modo da avere la funzione dichiarata come
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
e si passa il suo puntatore all'operatore < <. E dentro l'operatore che ha dichiarato qualcosa di simile
ostream& ostream::operator << (ostream& (*op)(ostream&));
la funzione è called.like
return (*endl)(*this);
Così quando si vede registrare
std::cout << std::endl;
poi std::endl
è puntatore a funzione che viene passata al operator <<
come argomento.
Nel record
std::endl(std::cout);
prefisso del namespace prima del nome endl
può essere omessa perché in questo caso il compilatore utilizzare l'argomento di ricerca dipendente. Quindi questo record
endl(std::cout);
verrà compilato correttamente.
Tuttavia, se per racchiudere il nome della funzione in parentesi poi ADL non viene utilizzato e il seguente record
(endl)(std::cout);
non verrà compilato.
fonte
2015-03-27 07:22:15
Simile a [Comportamento interessante del compilatore con spazi dei nomi] (http://stackoverflow.com/q/25976267/1708801) –