Да. В этом отношении лямбда-выражения не отличаются от других выражений (например, 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);