当C++ 14已经具有泛型lambda时,在C++ 20中引入模板lambda的需求是什么?

cod*_*101 90 c++ generic-lambda c++14 c++20

引入了通用lambdas,可以编写以下内容:

auto func = [](auto a, auto b){
    return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Run Code Online (Sandbox Code Playgroud)

很明显,这个通用lambda func就像模板化函数func一样有效.

为什么C++委员会决定为通用lamda添加模板语法?

Que*_*tin 106

C++ 14泛型lambdas是一种非常酷的生成仿函数的方法operator (),它看起来像这样:

template <class T, class U>
auto operator()(T t, U u) const;
Run Code Online (Sandbox Code Playgroud)

但不是这样的:

template <class T>
auto operator()(T t1, T t2) const; // Same type please
Run Code Online (Sandbox Code Playgroud)

也不是这样的:

template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please
Run Code Online (Sandbox Code Playgroud)

也不是这样的(尽管实际使用起来有点棘手):

template <class T>
auto operator()() const; // No deduction
Run Code Online (Sandbox Code Playgroud)

C++ 14 lambdas很好,但是C++ 20允许我们毫不费力地实现这些情况.

  • @SebastianMach差不多.使用该解决方案,`b`是非推导的,并且其参数将被隐式转换为`a`的类型. (10认同)
  • 简洁明了.只需添加:第一个(相同类型)可以通过C++ 14中的`(auto a,decltype(a)b)`来解决. (2认同)

Ant*_*ier 30

由于您可以在C++ 20中使用模板化lambda,因此您可以比SFINAE表达式更容易地限制类型:

auto lambda = []<typename T>(std::vector<T> t){};
Run Code Online (Sandbox Code Playgroud)

这个lambda只适用于矢量类型.

  • `consteval`与新语法有什么关系?这很酷,但我没有得到相关性. (8认同)

Sto*_*ica 22

被C++ 20接受的提案有一个冗长的动机部分,带有示例.它的前提是:

有一些关键原因导致作者认为定义通用lambda的当前语法不够.它的要点是,使用普通函数模板可以轻松完成的一些事情需要使用通用lambda来完成大量的跳跃,或者完全无法完成.作者认为lambdas足够有价值,C++应该支持它们和普通的功能模板一样.

以下是一些例子.


Ham*_*a.S 19

新的"熟悉的模板语法"在C++ 20 lambda表达式出台使得结构,如  for_types 和  for_range 可行的,相比于C++ 17层的替代方式更具有可读性.

(来源:使用C++ 20 lambdas进行编译时迭代)

在C++ 14和C++ 17通用lambda上可以完成的另一个有趣的事情是operator() 通过显式传递模板参数直接调用  :

C++ 14:

   auto l = [](auto){ };
   l.template operator()<int>(0);
Run Code Online (Sandbox Code Playgroud)

C++ 20:

  auto l = []<typename T>(){ };
  l.template operator()<int>();
Run Code Online (Sandbox Code Playgroud)

上面的C++ 14例子是没用的:没有方法operator() 可以引用lambda体中提供的类型  而不给参数命名和使用  decltype.此外,即使我们可能不需要它,我们也不得不通过论证.

C++ 20示例显示了如何在lambda的主体中轻松访问T,并且现在可以任意模拟nullary lambda.这对于上述编译时结构的实现非常有用