我想了解lambdas如何在C++中深入工作。我寫了下面這段代碼。用lambda調用移動構造函數
#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'移動構造函數調用。請注意,我通過值使用變量捕獲,因此如果沒有移動構造函數,則會在此處調用複製構造函數。爲什麼在這一步有額外的複製/移動?當fun
被作爲參數傳遞給f
時,人們會期望該對象僅被複制一次。此外,該對象的第一個副本立即銷燬。爲什麼?這是什麼中介副本?