如何在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(那里公认的答案表明这是一个不同的问题,但进一步的答案本质上是上述解决方案)。
答案 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
。