Большинство IO stream manipulators являются регулярными функциями со следующей подписью:Как «std :: cout << std :: endl;» компилировать?
std::ios_base& func(std::ios_base& str);
Однако некоторые манипуляторы (в том числе наиболее часто используемые из них - std::endl
и std::flush
) шаблонные следующего вида:
template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& func(std::basic_ostream<CharT, Traits>& os);
Тогда, как получается компиляция std::cout << std::endl;
, так как приведен следующий пример:
$ cat main.cpp
#include <iostream>
int main()
{
auto myendl = std::endl;
std::cout << myendl;
}
$ g++ -std=c++11 main.cpp -o main
main.cpp: In function ‘int main()’:
main.cpp:5:24: error: unable to deduce ‘auto’ from ‘std::endl’
auto myendl = std::endl;
^
Понятно, что контекст (в std::cout << std::endl;
) помогает компилятору устранить смещение ссылки на std::endl
. Но каковы правила, регулирующие эту процедуру? Он выглядит как настоящий вызов для перегрузки разрешение, которое должно ответить на два вопроса сразу:
- Какая специализация
std::endl<CharT, Traits>()
делаетstd::endl
относится? - К какой функции относится номер
operator<<
?
Вывод аргумента шаблона (1) должен происходить до разрешения перегрузки (2), но кажется, что для выполнения (1) требуется (хотя бы часть) (2) выполнить.
Несколько связанных, но не-полосная дублирующие вопросы:
- Does std::endl work with both cout and wcout?
- Why does endl(std::cout) compile
- How does std::flush work?
Ни один из этих вопросов, и ни ответы на них не обратиться за работой вывода аргумента шаблона, что sho uld предшествует разрешению перегрузки, но ему необходимо помочь последнему.
последующий вопрос:How does overload resolution work when an argument is an overloaded function?
@ πάνταῥεῖ Этот вопрос не является дубликатом. Это даже не то, что ответ Дитмара Кюля содержит информацию, запрошенную в моем очень другом вопросе (он только утверждает, что * «Компилятор автоматически выводит аргументы шаблона» *, в то время как мне любопытно, как работает этот вывод). – Leon
_ @ Leon_ Можете ли вы изложить свои аргументы в своем вопросе, почему вы думаете, что это не ясно объяснено в ответах Дитмара или других там, пожалуйста? Возможно, я подумаю, что ты снова закроешь свой вопрос. –
@ πάνταῥεῖ Я уже добавил эти аргументы в свое редактирование (до того, как вопрос был закрыт). – Leon