簡體   English   中英

C ++:你能做一個lambda隱式拷貝捕獲加上顯式拷貝捕獲嗎?

[英]C++: Can you do a lambda implicit copy capture plus explicit copy capture?

試圖保持一個對象存活(但不需要引用shared_ptr這樣做)我發現自己寫的東西是這樣的:

void ClassDerivedFromSharedFromThis::countdown(ThreadPool &pool, std::string name){
    auto self = shared_from_this();
    pool.then([=, self]{
        for(int i = 0;i < 10;++i){
            atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n";
        }
    });
}

但后來在visual studio中出現了一個錯誤,說我無法明確地復制捕獲因為我已經隱式地進行了復制捕獲......這迫使我寫道:

void countdown(ThreadPool &pool, std::string name){
    auto self = shared_from_this();
    pool.then([=]{
        self; //Capture self.
        for(int i = 0;i < 10;++i){
            atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n";
        }
    });
}

我知道這有效,但感覺不對。 由於我只需要shared_ptr所有權的副作用而不需要直接引用它,我想在捕獲列表而不是lambda體中表達它。

在我的真實代碼中,我想要在網絡代碼中的幾個嵌套lambda中捕獲大約5或6個變量,並且隱式捕獲更好更容易編輯。

我的問題是:這是標准行為還是Visual Studio 2015自己對lambda捕獲的限制? 該標准的較新版本允許這樣做,還是有人談過它?

是的,這是標准行為。 來自C ++ 14(N4140)[expr.prim.lambda] / 8

如果lambda-capture包含一個=capture-default ,則該lambda-capture的每個簡單 捕獲應為“ &identifier ”形式。

所以如果你有[=]那么你做的任何其他捕獲都必須通過引用來完成

[=, &some_var]{} // copy all implicitly but explicitly capture some_var by reference

規則確實在C ++ 17中有所改變,但它是允許的

[=, *this]{};

這將捕獲對象的副本到lambda。

您可以使用init-capture執行所需操作

void ClassDerivedFromSharedFromThis::countdown(ThreadPool &pool, std::string name){
    pool.then([=, self=shared_from_this()]{
        for(int i = 0;i < 10;++i){
            atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n";
        }
    });
}

有獎金,您不必單獨申報self

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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