template<typename T> do_something(T &&arg)
{
auto lambda = [/* how to capture arg? */] {
// std::forward<T>(arg)
};
lambda();
}
1
GeruzoniAnsasu 2019-06-26 19:34:39 +08:00
我怎么记得好像在哪看到过这个问题,然后说 lambda 里 capture 到的东西必须是个 lvalue,所以你可以 move,但 move 完它就是个有名字的 lvalue 了,无法作为 rvalue reference capture 下来。
仅凭印象,没有复查,如果说错了请谅解 |
2
wutiantong OP @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 |