C++ lambda 两次复制构造函数调用
C++ lambda two copy constructor calls
我有以下代码片段。
#include <iostream>
#include <functional>
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<void(A)> 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<void(A)>
有一个带有此签名的函数调用运算符:operator()(A)
即它按值获取其参数,因此调用 f(a)
会生成一个副本。
lambda 也按值获取其参数,因此当在 function<void(A)>
调用运算符中调用它时,会生成另一个副本。
如果您为 A
定义移动构造函数,您应该看到初始化 lambda 参数(从 function
制作的第一个副本)可以是移动而不是副本,但仅如果类型有移动构造函数。否则必须复制。
或者,如果您使用 std::function<void(const A&)>
,那么调用运算符将通过引用而不是值来获取其参数,因此只生成一个副本来初始化 lambda 的参数。
我有以下代码片段。
#include <iostream>
#include <functional>
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<void(A)> 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<void(A)>
有一个带有此签名的函数调用运算符:operator()(A)
即它按值获取其参数,因此调用 f(a)
会生成一个副本。
lambda 也按值获取其参数,因此当在 function<void(A)>
调用运算符中调用它时,会生成另一个副本。
如果您为 A
定义移动构造函数,您应该看到初始化 lambda 参数(从 function
制作的第一个副本)可以是移动而不是副本,但仅如果类型有移动构造函数。否则必须复制。
或者,如果您使用 std::function<void(const A&)>
,那么调用运算符将通过引用而不是值来获取其参数,因此只生成一个副本来初始化 lambda 的参数。