簡體   English   中英

Lambda作為std :: vector :: emplace_back的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM