如何明确表示lambda中捕获的变量的类型?

时间:2019-05-26 15:34:21

标签: c++ lambda capture

如何在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) */
  };
}

相关:Capturing perfectly-forwarded variable in lambda(那里公认的答案表明这是一个不同的问题,但进一步的答案本质上是上述解决方案)。

1 个答案:

答案 0 :(得分:0)

捕获右值(通用参考)的另一种方法如下,

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. 简单来说,它意味着根据初始值设定项推导出自动变量,并且不需要显式指定其类型,例如

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

此处y将被初始化程序int推导为x + 2