簡體   English   中英

通過值捕獲使用Lambda表達式

[英]Using lambda expressions by value capture

快速查詢有關lambda捕獲的用法,尤其是有關“按值捕獲”的查詢。 這是我的代碼:

class carl{
public:
    int x;      
    void sayhi();
};


void carl::sayhi(){

    auto c1 = [=](){            //capture by value
    std::cout<<&x<<std::endl;   
    x = 10;                     // access the copy?
    };

    c1();
    std::cout<<&x<<std::endl;   // same address as the one inside lambda
    std::cout<<x<<std::endl;    //prints 10 now WHY????
}

int main(int argc, char** argv) {

carl x;
x.sayhi();

return 0;
}

我的問題是,lambda中的“按值”捕獲是否應該影響原始數據? 他們不應該復制嗎? 在我的示例中,我使用了[=]因此我的lambda將在該類范圍內復制該變量。 我嘗試訪問x ,它直接更改了x的原始值。 我嘗試用自己的話進行研究:有人說訪問具有[=]捕獲的lambda內的變量將訪問lambda的本地副本。

編輯:實際上,我感覺到我正在嘗試訪問也從[=]捕獲的this指針。 因此,從我的代碼訪問x就像訪問this->x ,它與我的原始指針相同。 如果我錯了,請糾正我。

當您訪問lambda內部的非靜態類數據成員時,實際上是按值捕獲this指針並以this->x訪問類成員。 這意味着不會制作x本地副本。 您正在修改當前對象中的實際x

實際上,如果某個值確實是“按值”捕獲的(作為副本),則對其進行修改的嘗試將失敗。 如果x確實是按值捕獲的,則x = 10甚至不會編譯。 如果要能夠修改捕獲的狀態,則需要將lambda聲明為mutable

暫無
暫無

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

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