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