Es ist die Art und Weise der Strom Manipulatoren arbeiten. Manipulatoren sind Funktionen, die an den Operator < < als Argumente übergeben wurden. Dann werden sie im Operator einfach gerufen.
So haben Sie Funktion erklärt wie
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
und Sie übergeben ihre Zeiger auf Operator < <. Und im Inneren der Operator, der etwas erklärt wie
ostream& ostream::operator << (ostream& (*op)(ostream&));
die Funktion called.like
return (*endl)(*this);
So bei der Aufnahme sehen
std::cout << std::endl;
dann std::endl
Funktionszeiger, die auf die übergeben wird operator <<
als Argument.
Im Rekord
std::endl(std::cout);
Namespacepräfix vor Namen endl
da in diesem Fall verzichtet werden kann der Compiler wird das Argument abhängigen Lookup verwenden. Dieser Datensatz
endl(std::cout);
wird erfolgreich kompiliert.
Allerdings, wenn Sie die Funktionsnamen in Klammern einzuschließen dann wird ADL nicht verwendet und die folgende Datensatz
(endl)(std::cout);
wird nicht kompiliert.
Ähnlich wie [Interessantes Verhalten des Compilers mit Namespaces] (http://stackoverflow.com/q/25976267/1708801) –