当前位置:  开发笔记 > 编程语言 > 正文

C++ lambda两个复制构造函数调用

如何解决《C++lambda两个复制构造函数调用》经验,为你挑选了1个好方法。

我有以下代码片段.

#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).



1> Jonathan Wak..:

function有一个带有此签名的函数调用操作符:operator()(A)即它按值​​获取其参数,因此调用f(a)会生成一个副本.

lambda也通过值获取其参数,因此当在function调用操作符内调用它时,会生成另一个副本.

如果你定义了一个移动构造函数,A你应该看到初始化lambda参数(来自第一个副本function)可以是一个移动而不是一个副本,但只有当类型有一个移动构造函数时.否则必须复制.

或者,如果你使用std::function那么调用操作符将通过引用而不是值来获取它的参数,因此只有一个副本,用于初始化lambda的参数.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有