gpt4 book ai didi

c++11 - C++ lambda 传递

转载 作者:行者123 更新时间:2023-12-01 16:54:42 25 4
gpt4 key购买 nike

这只是理论问题。当我执行这段代码时:

#include <functional>
#include <cstdio>

struct A {

int value = 100;

A() {
printf("A\n");
}

A(const A& a) {
printf("copy A\n");
}

~A() {
printf("~A\n");
}
};

void function(std::function<int()> lambda) {
printf("%d\n", lambda());
}

int main()
{
A a;
auto lambda = [a]() -> int {
return a.value;
};

function(lambda);

return 0;
}

输出是这样的:

A
copy A
copy A
copy A
100
~A
~A
~A
~A

我的问题是为什么 struct A 被复制了 3 次,而不是 2 次?第一个副本采用 lambda 捕获,第二个副本将参数传递给函数,第三个副本采用什么?

最佳答案

如果您按如下方式更改代码,您将看到相同数量的复制操作:

int main()
{
A a;
auto&& lambda = [a]() -> int {
return a.value;
};
std::function<int()>{lambda};
}

第一个复制/移动构造发生在创建 lambda 时。第二次和第三次复制/移动构造发生在 std::function 构造期间。根据 N3690,std::function 使用的构造函数如下所示:

template <class F> function(F);

这意味着,在将参数传递给构造函数时,传递的参数将被复制/移动一次。在构造函数中,它将再次被复制/移动以进行类型删除。

如果构造函数使用引用来代替(例如,使用完美转发),您只会看到两个复制/移动构造。但是,我不知道为什么在本例中没有使用它。

template <typename Arg> function(Arg&&);

关于c++11 - C++ lambda 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22576230/

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