我有以下代码片段.
#include#include using namespace std; struct A { A() { cout << "A "; data = 1; } A(const A& a) { cout << "cA "; data = a.data; } ~A() { cout << " dA"; } int data; }; void f(A& a, function f) { cout << "("; f(a); cout << ")"; } int main() { A temp; auto fun = [](A a) {cout << a.data;}; f(temp, fun); }
输出是:
A(cA cA 1 dA dA)dA
为什么要temp
复制两次?
我使用的是Visual C++(vc140).
function
有一个带有此签名的函数调用操作符:operator()(A)
即它按值获取其参数,因此调用f(a)
会生成一个副本.
lambda也通过值获取其参数,因此当在function
调用操作符内调用它时,会生成另一个副本.
如果你定义了一个移动构造函数,A
你应该看到初始化lambda参数(来自第一个副本function
)可以是一个移动而不是一个副本,但只有当类型有一个移动构造函数时.否则必须复制.
或者,如果你使用std::function
那么调用操作符将通过引用而不是值来获取它的参数,因此只有一个副本,用于初始化lambda的参数.