[英]Lambda as an argument to std::vector::emplace_back
我遇到了將lambda作為參數傳遞給emplace_back的代碼,這讓我很困惑。 所以我寫了一個小測試來驗證這樣的語法:
struct A
{
int a;
A(){cout<<"constructed"<<endl;}
A(const A& other){a = other.a; cout<<"copied"<<endl;}
A(const A&& other){a = other.a; cout<<"moved"<<endl;}
};
int main()
{
vector<A> vec;
vec.emplace_back(
[]{A a;
a.a = 1;
return a;
}());
A a2;
a2.a = 2;
vec.emplace_back(std::move(a2));
return 0;
}
我有兩個問題:1)有人可以澄清一個lambda如何作為emplace_back的參數傳遞? 我過去只看過構造函數參數傳遞給了emplace。 2)輸出結果是:
constructed
moved
constructed
moved
copied
最后復制的來自哪里? 為什么這兩種方法不相同。
有人可以澄清lambda如何作為emplace_back的參數傳遞?
你沒有傳遞一個lambda。 相反,您傳遞調用lambda的結果 。
最后復制的來自哪里?
它來自矢量。 當a2
插入到vec
,會發生重新分配,重新分配內存並將舊內存中的對象復制到新內存。
如果將移動構造函數指定為noexcept
,即
A(const A&& other) noexcept {a = other.a; cout<<"moved"<<endl;}
然后std::vector
將在重新分配期間移動對象而不是復制,您可以看到最后一個副本變為移動。
注意lambda定義之后的()
,它調用lambda。 此代碼等效於以下內容:
int main()
{
auto make_a = []()
{
A a;
a.a = 1;
return a;
};
vector<A> vec;
vec.emplace_back(make_a());
// ...
}
其中,因為lambda具有空捕獲,相當於:
A make_a()
{
A a;
a.a = 1;
return a;
}
int main()
{
vector<A> vec;
vec.emplace_back(make_a());
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.