Ответ 1
Да, тип закрытия не должен быть окончательным. По крайней мере, это моя интерпретация.
§8.1.5.1 Типы закрытия [expr.prim.lambda.closure]
Реализация может определять тип закрытия иначе, чем описано ниже, если это не изменяет наблюдаемое поведение программы, кроме как путем изменения:
- ... [не применяется]
Стандарт тогда не описывает тип закрытия как окончательный. Создание окончательного варианта изменило бы наблюдаемое поведение ergo, тип закрытия не должен быть окончательным.
Что касается наблюдаемого поведения. Учти это:
auto l = []{};
return std::is_final_v<decltype(l)>;
Создание окончательного типа закрытия явно изменило бы наблюдаемое поведение действительной программы.
Что касается варианта использования, это может быть очень полезной функцией:
template <class... Fs> struct Overload : Fs ...
{
using Fs::operator()...;
};
template <class... Fs> Overload(Fs...) -> Overload<Fs...>;
auto test()
{
Overload f = {[] (int a) { return a * 100; },
[] (int a, int b) { return a + b;}};
return f(1) + f(2, 3); // 105
}
Смотрите это в действии на godbolt
Благодаря hvd и rakete1111 для обсуждений и отзывов в комментариях.