您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在lambda表達式中使用引用形式捕捉局部變量,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲
F.52 在lambda表達式中使用引用形式捕捉局部變量,包含向算法傳遞變量的情況。
譯者注:如果你不清楚捕捉(capture)是什么
Reason(原因)
為了效率和正確性,在本地使用lambda表達式時,你差不多總是需要通過引用方式捕捉變量。這包括編寫或者調用本地并發算法的情況,因為它們需要在返回前匯合(從而保證安全性,譯者注)。
關于效率的考慮:對于大多數類型來說,傳引用都會比傳值的成本更低。
關于正確性的考慮:許多調用都希望(在被調用函數被執行的同時,)對處于調用側的原始對象產生連帶效果(參考下面的示例)。傳值做不到這一點。
不幸的是,對于局部調用,不存在簡單的方法可以通過引用捕捉常量類型變量獲得效率又可以避免連帶效果。
譯者注:常量類型應用應該指的是在函數聲明中的被聲明為常量的引用參數,通過這種方式可以同時提供高效率和寫保護。
這里,一個大對象(一個網絡消息)傳遞給一個迭代算法,拷貝該消息不是高效或者正確的做法(它也許不能拷貝):
std::for_each(begin(sockets), end(sockets), [&message](auto& socket){ socket.send(message);});
譯者注:每次循環都拷貝的代價也很高。
這是一個簡單的三階段并發管道。每個state對象封裝一個工作線程和一個隊列,有一個process函數處理入隊,它的析構函數在關閉線程之前自動地進入阻塞狀態以等待隊列變空。
void send_packets(buffers& bufs){ stage encryptor([] (buffer& b){ encrypt(b); }); stage compressor([&](buffer& b){ compress(b); encryptor.process(b); }); stage decorator([&](buffer& b){ decorate(b); compressor.process(b); }); for (auto& b : bufs) { decorator.process(b); }} // automatically blocks waiting for pipeline to finish
譯者注:代碼中使用的是隱式捕捉,具體可以參考:https://mp.weixin.qq.com/s/RNpLqwekN3BJUbIN-DwVxQ
標記lambda表達式采用引用方式捕獲變量,但是沒有在函數范圍內本地使用,或者通過引用方式傳遞給另外一個函數的情況。
注意:這是一個近似的規則,但是確實可以標記出:通過很有可能被調用者保存的指針進行的傳遞,對通過參數訪問的堆上的某處進行的寫入,返回lambda表達式等等。生命周期準則群組也會提供標記逃逸指針和參照的普遍準則,也會包含源自lambda表達式的情況。
上述內容就是如何在lambda表達式中使用引用形式捕捉局部變量,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。