How to capture perfectly-forwarded variable in lambda ?

2019-06-26 10:41:51 +08:00
 wutiantong
template<typename T> do_something(T &&arg) 
{
    auto lambda = [/* how to capture arg? */] {
        // std::forward<T>(arg)
    };
    lambda();
}
1808 次点击
所在节点    C
2 条回复
GeruzoniAnsasu
2019-06-26 19:34:39 +08:00
我怎么记得好像在哪看到过这个问题,然后说 lambda 里 capture 到的东西必须是个 lvalue,所以你可以 move,但 move 完它就是个有名字的 lvalue 了,无法作为 rvalue reference capture 下来。


仅凭印象,没有复查,如果说错了请谅解
wutiantong
2019-06-27 10:28:43 +08:00
@GeruzoniAnsasu 你说的是对的呀,C++14 里引入了带 initializer 的 capture 以此来解决 move 的问题,但这个语法仅限于通过 auto 或者 auto &来自动推断类型,所以不能直接得到 rvalue ref
然后针对 perfectly-forward 的情况就需要通过一些 wrapper 的手段来绕一下,我搜到的这篇文章讲了很详细:
https://vittorioromeo.info/index/blog/capturing_perfectly_forwarded_objects_in_lambdas.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577560

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX