gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:56 24 4
gpt4 key购买 nike

我有以下代码片段。

#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 的参数。

关于C++ lambda 两次复制构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34021289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com