如何对lambda中捕获的变量的类型进行明确说明

How to be explicit about the type of a captured variable in a lambda?

本文关键字:类型 说明 变量 lambda      更新时间:2023-10-16

如何明确指定c 中的lambda捕获变量的类型?

例如,假设我具有一个通用引用的函数,我想将其完美地向lambda。

我发现,我可以为此使用std::tuple,如下所示,但是我想知道是否有更简洁的方式。

template<typename T>
auto returns_functor (T&& value)
{
  return [value = std::tuple<T> (std::forward<T> (value))] ()
  {
    /* use std::get<0> (value) */
  };
}

相关:在lambda中捕获完美的变量(那里的答案表明这是一个不同的问题,但进一步的答案本质上给出了上述解决方案(。

捕获rvalue(通用参考(的另一种方式如下,

template< typename T>
T getRvalue( T&& temp)
{
  auto lambda = [ rTemp = std::move( temp)]() mutable
  {
     return T( std::forward< T>( rTemp));
  };
  return lambda();
}

std::move()允许捕获可移动类型的对象,这些对象无法通过复制捕获。 mutable在Lambda中非常重要,直到不使用mutable为止,lambda捕获的对象无法修改,并且编译将产生以下错误,

cannot conver 'rTemp (type 'const T') to type 'std::remove_reference<T>::type&' {aka 'T&'}
return T( std::forward< T>( rTemp));

现在关于第一个问题,
"我如何明确指定C 中lambda的捕获变量的类型?,编译将做到这一点,请参见以下链接,

https://en.cppreference.com/w/cpp/language/lambda

它用简单的单词陈述 A capture with an initializer acts as if it declares and explicitly captures a variable declared with type auto, whose declarative region is the body of the lambda expression. ,这意味着自动变量根据初始器来推导,并且不需要明确指定其类型,例如

P>

int x = 1;
auto lambda = [ y = x + 2](){ std::cout<< "y = "<< y<< std::endl;};

在此,y将由 int推导为CC_7。