Igo*_*evo 6 c++ lambda copy-constructor visual-c++ c++11
我有以下代码片段.
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
A(cA cA 1 dA dA)dA
为什么要temp复制两次?
我使用的是Visual C++(vc140).
Jon*_*ely 13
function<void(A)>有一个带有此签名的函数调用操作符:operator()(A)即它按值获取其参数,因此调用f(a)会生成一个副本.
lambda也通过值获取其参数,因此当在function<void(A)>调用操作符内调用它时,会生成另一个副本.
如果你定义了一个移动构造函数,A你应该看到初始化lambda参数(来自第一个副本function)可以是一个移动而不是一个副本,但只有当类型有一个移动构造函数时.否则必须复制.
或者,如果你使用std::function<void(const A&)>那么调用操作符将通过引用而不是值来获取它的参数,因此只有一个副本,用于初始化lambda的参数.
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |