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

时间:2015-07-22 16:16:52

标签: c++ lambda

我有以下功能

template<class Function>
void f(Function&& g) {
    h(..., [&g](){g();});
}

它是一个函数f接受函数,lambda或functor作为参数。在其中调用函数h,我将lambda作为参数传递给g并通过捕获接收g

  1. 我应该在lambda的捕获字段中传递g还是&g
  2. 是否可以使用上述代码复制仿函数?

3 个答案:

答案 0 :(得分:2)

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

g

答案 1 :(得分:1)

您正在构建一个不接受任何参数并且不返回任何参数的lambda。但是你已经有了这样一个仿函数:g!你应该转发

template<class Function>
void f(Function&& g) {
    h(..., std::forward<Function>(g));
}

答案 2 :(得分:1)

您可以这样做:

template<class Function>
void f(Function&& g) {
    Function f(std::move(g));
    int additional = 0;
    h(..., [&f, additional](){f(additional);});
}