我有以下功能
template<class Function>
void f(Function&& g) {
h(..., [&g](){g();});
}
它是一个函数f
接受函数,lambda或functor作为参数。在其中调用函数h
,我将lambda作为参数传递给g
并通过捕获接收g
。
g
还是&g
?答案 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);});
}