【发布时间】:2019-10-12 08:55:56
【问题描述】:
如何在 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(那里接受的答案表明这是一个不同的问题,但进一步的答案基本上给出了上述解决方案)。
【问题讨论】:
-
如果你把它保留为
T有什么优点来指定它? -
value = std::forward<T>(value)有什么问题? -
@HolyBlackCat 那不是总是按副本捕获吗?
-
@RaymondChen 在该示例中,您传入了一个右值引用,因此它将被移动到
tuple<string>中,并且没有生命周期问题。可能的问题是如果你传入一个左值引用,然后让 lambda 活得更久。 -
@HolyBlackCat 它会复制或移动,但它永远不会持有引用。所以不能算完美转发。此外,如果您只需要复制或移动,那么您只需指定
[value]。