![](/img/trans.png)
[英]C++: Can you do a lambda implicit copy capture plus explicit copy capture?
[英]When to prefer explicit capture in lambda over implicit captures?
有時我會在本地函數中執行std::find_if
(例如),該函數有5個局部變量,包括參數。 但是,傳入STL算法的lambda只需要訪問其中的1個。 我可以通過以下兩種方式之一來捕獲它:
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [=](int number) {
return number == four;
});
}
或者我可以這樣做:
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [four](int number) {
return number == four;
});
}
(注意我沒有編譯此代碼,對任何語法錯誤或其他錯誤道歉)
我知道隱式捕獲是基於odr使用的規則,所以在功能和實現方面,我認為兩者都是相同的。 什么時候使用顯式捕獲而不是隱式捕獲? 我唯一的想法與封裝原則有些相關:只能訪問所需的東西,編譯器可以幫助您確定何時訪問變量。 它還保持方法的本地狀態(它的不變量,在執行期間函數的生命周期)更安全。 但這些真的是實際問題嗎?
是否存在使用顯式捕獲而不是隱式捕獲的功能性原因? 遵循什么是好的經驗法則或最佳做法?
在運行時使用[=]
或[&]
是最簡單和最有效的,無需命名任何名稱。
在這種情況下,如由這個答案 ,變量,只有當他們是ODR使用的拍攝。 換句話說,編譯器只捕獲所需的內容。
如果指定捕獲列表,則可能會出現兩個差異:
在第二種情況下,如果按值捕獲,則意味着對象被不必要地復制。
所以,我的建議是使用[]
, [&]
或[=]
除非你能想到一個特殊情況的好理由。 一個這樣的情況可能是你想要通過引用和一些值來捕獲一些變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.