簡體   English   中英

C ++ 17 lambda capture * this

[英]C++17 lambda capture *this

C ++ 17將按值添加此對象的副本捕獲捕獲規范為[*this]

這有用嗎? 它是如何捕捉比不同this [tmp = *this]在C ++ 14中已經不能實現[tmp = *this]嗎?


用於解釋為什么P0018R3在其示例中使用[=, tmp = *this]而不是[tmp = *this]獎勵。 如果他們使用了[tmp = *this] ,那么C ++ 14解決方案的所有列出的缺點都將被消除。

它有用嗎? 當你需要*this的副本時它很有用 - 例如,當lambda被評估時, *this本身不再有效。

它是如何從不同捕捉this 它創建了對象的副本 ,因此在評估lambda時,它的this指針引用副本,而不是原始對象。

可以用[tmp = *this]在C ++ 14中實現嗎? 它可以,但[*this]更方便,因為可以移動代碼而無需使用tmp.為成員訪問添加前綴tmp. 否則,特別是[=, tmp = *this] ,當您打算引用副本時(特別是如果您習慣於剪切+粘貼編程),可能會意外地引用原始對象的成員。 [=,*this]在這種情況下是一個更安全的替代方案,因為原始對象不能從lambda體內部訪問(至少不能通過this指針)。

想象一下*this是一個句柄類,它將shared_ptr維護到某個共享狀態。

共享impl是(例如)協議處理程序狀態機。

handle類通過一系列異步處理程序傳遞,因此它本身必須是可復制的。 每個處理程序都會改變共享狀態。

一個強大的用例可能是與自定義asio服務一起使用的協議處理程序(例如, http_protocol_socket )。

[=, tmp = *this]將以值的形式捕獲任何變量,包括相當危險的, this指針本身,以及特別是將*this捕獲到tmp

在這種情況下,使用它會是危險的不經意指this在異步處理程序,因為它很可能是一個懸擺指針。 這是一個等待發生的錯誤。

[tmp=*this]只捕獲*this

暫無
暫無

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

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