Как стать автором
Обновить
8
0
Крылов Евгений @dedkryl

Программист

Отправить сообщение
Да, конечно. Тут уже речь идет не о перегрузке функций, а о сначала о выводе типа шаблона.
В строке вида
for_each(begin(int_c), end(int_c), [](auto a) { return f(a); });
Для for_each имеем
template <class _InIt, class _Fn>
_Fn for_each(_InIt _First, _InIt _Last, _Fn _Func) {…

вывод типа _Fn, следовательно вывод типа а, следовательно разрешение перегрузки
f(a). Согласны?

Дело не в лямбде и обычной функции. Дело в том, что в строке
for_each(begin(int_c), end(int_c), f);
у f отсутствуют параметры, по которым компилятор мог бы разрешить перегрузку. Он не может выбрать между
void f(int i){} и
void f(string s){}, поскольку не видит в этой строке типа параметра (как и их кол-ва).
Напротив, для
[](int a) { return f(a); }
или полиморфной лямбды
[](auto a) { return f(a); }
(в качестве оболочки над f(a))
виден тип параметра а, что
позволяет компилятору разрешить перегрузку и подставить подходящую функцию.
(не вписался в 2 слова)
Дело не в лямбде и обычной функции. Дело в том, что в строке
for_each(begin(int_c), end(int_c), f);
у f отсутствуют параметры, по которым компилятор мог бы разрешить перегрузку. Он не может выбрать между
void f(int i){} и
void f(string s){}, поскольку не видит в этой строке типа параметра (как и их кол-ва).
Напротив, для
[](int a) { return f(a); }
или полиморфной лямбды
[](auto a) { return f(a); }
(в качестве оболочки над f(a))
виден тип параметра а, что
позволяет компилятору разрешить перегрузку и подставить подходящую функцию.
(не вписался в 2 слова)

Информация

В рейтинге
Не участвует
Откуда
Гатчина, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность