Ich lese The C ++ Programming Language, 4. Ausgabe (von Bjarne Stroustrup ) überargumentabhängige Suche. Hier ist das Zitat (26.3.6, Overaggressive ADL):
Die argumentabhängige Suche (oft als ADL bezeichnet) ist sehr nützlich, um Ausführlichkeit zu vermeiden (14.2.4). Beispielsweise:
#include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL }
Ohne argumentabhängige Suche
endl
würde der Manipulator nicht gefunden werden. So wie es ist, bemerkt der Compiler, dass das erste Argument<<
einostream
definiertes in iststd
. Daher sucht esendl
instd
und findet es (in<iostream>
).
Und hier ist das Ergebnis des Compilers (C ++ 11-Modus):
prog.cpp: In function ‘int main()’:
prog.cpp:4:36: error: ‘endl’ was not declared in this scope
std::cout << "Hello, world" << endl;
^
Entweder ist dies ein Fehler im Compiler oder im Buch. Was sagt der Standard?
Aktualisieren:
Ich muss ein bisschen klarstellen. Ich weiß, dass die richtige Antwort zu verwenden ist std::endl
. Die Frage betraf den Text im Buch. Wie Lachlan Easton bereits sagte, ist es nicht nur ein Tippfehler. Der ganze Absatz ist (wahrscheinlich) falsch. Ich kann diese Art von Fehler akzeptieren, wenn das Buch von einem anderen (weniger bekannten) Autor stammt, aber ich war (und bin) im Zweifel, weil es von Bjarne geschrieben wurde.
std::
dies in diesem Fall aufgrund von ADL nicht erforderlich ist. Dies kompiliert aber nicht, daher die Frage.
std::endl
Kein Fehler