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