c++20 模板 lambda 的用例是什么?

What is the use case for c++20 template lambdas?

我们在 C++20 之前就有通用的 lambda 表达式,可以写出这样的东西。

   auto l = [](auto a, auto b)
   {
       return a+b;
   };

然后 C++20 引入了模板 lambda,我们可以在其中编写类似这样的东西

   auto l = []<typename T>(T a, T b)
   {
       return a+b;
   };

或者这个

   auto l = []<typename T>(T a, auto b)
   {
       return a+b;
   };

有人可以解释一下有什么区别吗?
更具体地说,哪些模板 lambda 可以实现 C++20 之前的泛型 lambda 无法实现的目标?

auto l = [](auto a, auto b)

可以使用两个完全不同的参数调用此 lambda。 a 可以是 intb 可以是 std::string

auto l = []<typename T>(T a, T b)

必须使用两个类型相同的参数调用此 lambda。 T,就像在常规模板中一样,只能是一个特定的类型。

这是主要区别。在 C++20 之前,您可能可以使用 static_assert 实现大部分相同的事情,但这简化了它。

我发现有用的一个用例是立即调用

[]<std::size_t... Is>(std::index_sequence<Is...>)
{
    // ...
}(std::make_index_sequence<N>());

pre-template lambda,你必须创建辅助函数。