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