gpt4 book ai didi

c++ - 如何明确说明 lambda 中捕获变量的类型?

转载 作者:太空宇宙 更新时间:2023-11-04 12:36:09 25 4
gpt4 key购买 nike

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

最佳答案

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

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

它声明 带有初始化器的捕获就像它声明并显式捕获一个声明为 auto 类型的变量一样,其声明区域是 lambda 表达式的主体。 简单来说,就是根据初始化器推导自动变量,不需要明确指定它的类型,例如

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

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

关于c++ - 如何明确说明 lambda 中捕获变量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56314931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com