簡體   English   中英

什么時候更喜歡lambda中的顯式捕獲而不是隱式捕獲?

[英]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使用的規則,所以在功能和實現方面,我認為兩者都是相同的。 什么時候使用顯式捕獲而不是隱式捕獲? 我唯一的想法與封裝原則有些相關:只能訪問所需的東西,編譯器可以幫助您確定何時訪問變量。 它還保持方法的本地狀態(它的不變量,在執行期間函數的生命周期)更安全。 但這些真的是實際問題嗎?

是否存在使用顯式捕獲而不是隱式捕獲的功能性原因? 遵循什么是好的經驗法則或最佳做法?

  • 顯式捕獲總是優選的,因為它不易出錯
  • 在重物(不是簡單的int,double等)的情況下使用&更好
  • 當您計划在變量捕獲范圍之外使用lambda時使用=。 有了&有懸而未決的參考當地銷毀變量的風險

在運行時使用[=][&]是最簡單和最有效的,無需命名任何名稱。

在這種情況下,如由這個答案 ,變量,只有當他們是ODR使用的拍攝。 換句話說,編譯器只捕獲所需的內容。

如果指定捕獲列表,則可能會出現兩個差異:

  • 你忘了捕捉lambda使用的東西
  • 你捕獲了lambda不需要的東西。

在第二種情況下,如果按值捕獲,則意味着對象被不必要地復制。

所以,我的建議是使用[][&][=]除非你能想到一個特殊情況的好理由。 一個這樣的情況可能是你想要通過引用和一些值來捕獲一些變量。

暫無
暫無

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

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