Я читаю Язык программирования C ++, 4-е издание (от Бьярна Страуструпа) о аргумент-зависимый-поиск. Вот цитата (26.3.6, Сверхагрессивный ADL):
Поиск, зависящий от аргументов (часто называемый ADL), очень полезен, чтобы избежать многословия (14.2.4). Например:
#include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL }
Без поиска, зависящего от аргументов, манипулятор
endl
не был бы найден. Как бы то ни было, компилятор замечает, что первым аргументом для<<
являетсяostream
, определенный вstd
. Следовательно, он ищетendl
вstd
и находит его (в<iostream>
).
А вот результат, созданный компилятором (режим C ++ 11):
prog.cpp: In function ‘int main()’:
prog.cpp:4:36: error: ‘endl’ was not declared in this scope
std::cout << "Hello, world" << endl;
^
Либо это ошибка в компиляторе, либо в книге. Что говорит стандарт?
Обновление:
Мне нужно немного уточнить. Я знаю, что правильный ответ - использовать std::endl
. Вопрос был о тексте в книге. Как уже сказал Лахлан Истон, это не просто опечатка. Весь абзац (вероятно) неверен. Я могу принять такую ошибку, если книга написана другим (менее известным) автором, но у меня были (и до сих пор есть) сомнения, потому что она была написана Бьярном.
std::endl
без ошибок - person aaronman   schedule 06.08.2013std::
не требуется в этом случае из-за ADL. Но это не компилируется, отсюда и вопрос. - person BlueRaja - Danny Pflughoeft   schedule 07.08.2013<<
, ноstd::endl
является аргументом, и ADL не влияет на него - person aaronman   schedule 07.08.2013endl
, являются функциями, и, глядя на это, я думаю, что Бьярн может быть прав, а компилятор ошибается (потому чтоout << endl
переводится какendl(out)
): cplusplus.com/reference/ostream/endl/?kw=endl - person Axel   schedule 07.08.2013endl
- это функция, НО в процитированном выраженииendl
используется как аргумент дляoperator<<
. Таким образом, правило не применяется, как указывает Питер Александр в своем ответе и в моем комментарии к его ответу. - person alfC   schedule 16.12.2013