Ответ 1
Да. В этом отношении лямбда-выражения ничем не отличаются от других выражений (например, 0
). Но учтите, что дедукция не используется с дефолтными параметрами. Другими словами, если вы объявляете
template<typename T>
void foo(T = 0);
то foo(0);
вызовет foo<int>
, но foo()
будет плохо сформирован. Вам нужно будет явно вызвать foo<int>()
. Поскольку в вашем случае вы используете выражение лямбда, никто не может вызвать foo
, поскольку тип выражения (на сайте параметра по умолчанию) уникален. Однако вы можете сделать:
// perhaps hide in a detail namespace or some such
auto default_parameter = [](int x) { return x; };
template<
typename Functor = decltype(default_parameter)
>
void foo(Functor f = default_parameter);