gpt4 book ai didi

c++ - move 用lambda调用的构造函数

转载 作者:行者123 更新时间:2023-12-01 14:44:52 25 4
gpt4 key购买 nike

我试图深入了解lambda如何在C++中工作。我已经编写了以下代码。

#include <iostream>
#include <functional>

struct A
{
A() { std::cout << "A" << (data = ++count) << ' '; }
A(const A& a) { std::cout << "cA" << (data = a.data + 20) << ' '; }
A(A&& a) { std::cout << "mA" << (data = std::move(a.data) + 10) << ' '; }
~A() { std::cout << "dA" << data << ' '; }
int data;
static int count;
};

int A::count = 0;

void f(A& a, std::function<void(A)> f)
{
std::cout << "( ";
f(a);
std::cout << ") ";
}

int main()
{
A temp, x;
auto fun = [=](A a) {std::cout << a.data << '|' << x.data << ' ';};
std::cout << "| ";
f(temp, fun);
std::cout << "| ";
}

输出如下。

A1 A2 cA22 | cA42 mA52 dA42 ( cA21 mA31 31|52 dA31 dA21 ) dA52 | dA22 dA2 dA1



这对我来说很清楚,除了'mA52'move构造函数调用。请注意,我使用的是按值捕获变量,因此如果没有move构造函数,则将在此处调用copy-constructor。为什么在此步骤还有其他副本/移动?人们期望当 fun通过值作为 f的参数传递时,对象仅被复制一次。此外,该对象的第一个副本会立即被销毁。为什么?这是什么中间副本?

最佳答案

让我们将您的lambda类型称为L。它没有命名,但是在没有名称的情况下引用它会引起混淆。

构造函数std::function<void(A)>(L l)按值获取L。这涉及创建原始fun的副本。

然后,构造函数将lambda从l移到std::function<void(A)>包装器管理的某些存储中。此举还涉及移动任何捕获的实体。

关于c++ - move 用lambda调用的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34041427/

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