Здравствуйте, SergH, Вы писали:
SH>Так и должно быть? Можно как-то просто объяснить, почему?
Шаблонная лямбда порождает
нешаблонный класс с
шаблонным методом `operator ()`. Ключевой момент тут в том, что тип лямбды, т.е. самого closure-объекта —
не шаблонный. Таким образом при вызове функции
test([](auto x, auto y) { func(x, y);});
никаких трудностей с дедукций шаблонного параметра `F` у компилятора не возникает — он сразу определен однозначно. Дедукция `auto` для вашей лямбды будет делаться позже совсем в другом месте — в точке вызова `operator ()`, то есть в точке `f(1, 2);`, где все тоже однозначно.
Для варианта
test(func);
ситуация совсем иная — дедукция всех шаблонных аргументов (и `F` для `func` и `T` для `test`) должна быть сделана немедленно в этой точке. А это невозможно.