如何将c ++ functor rvalue引用传递给lambda的捕获?

chm*_*ike 6 c++ lambda

我有以下功能

template<class Function>
void f(Function&& g) {
    h(..., [&g](){g();});
}
Run Code Online (Sandbox Code Playgroud)

它是一个f接受函数,lambda或functor作为参数的函数.在它内部调用h我传递lambda 的函数作为通过捕获调用g和接收g的参数.

  1. 我应该通过g还是&g在lambda的捕获区域?
  2. 是否可以使用上面的代码复制仿函数?

Col*_*mbo 4

如果您g通过引用捕获,即使用&g代码片段中显示的语法,则不会执行任何复制。这是首选方式。仅当 lambda 可能在完成后被调用时才应进行复制,这可能意味着所引用的f对象被破坏。\n在这种情况下,转发可能会更便宜:g

\n\n
template<class Function>\nvoid f(Function&& g) {\n    h(\xe2\x80\xa6, [g=std::forward<Function>(g)] {g();});\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 请注意,在这里,您复制/移动了原始的“g”。请参阅[perfectly-capturing-a-perfect-forwarder-universal-reference-in-a-lambda](http://stackoverflow.com/questions/31410209/perfectly-capturing-a-perfect-forwarder-universal-reference-in -a-lambda/31410880#31410880) (2认同)
  • @Jarod42 这就是我的意图。 (2认同)