如何在Lambda中捕获类成员的嵌套类成员?
解决方案
直接在Lambda捕获阶段就获取并绑定目标Answer对象,避免执行时再通过this间接访问,就能解决后续content或currentStep变化导致的引用错误。以下是两种常用写法,按需选择:
1. 按值捕获Answer对象(推荐,生命周期安全)
如果Answer类型支持拷贝,直接把附加时的对象拷贝到Lambda里,后续原对象的变更不会影响Lambda的执行:
// 先拿到目标对象,再捕获 auto& target_answer = this->content->currentStep->answers[i]; choices.back()->onClick([this, target_answer] { decide(target_answer); }); // 更简洁的捕获初始化写法(C++11及以上支持) choices.back()->onClick([this, answer = this->content->currentStep->answers[i]] { decide(answer); });
这种方式相当于把当时的Answer对象“快照”存在Lambda里,完全不受后续content、currentStep变化的影响。
2. 按引用捕获Answer对象(需保证生命周期安全)
如果你能确保content、currentStep、answers在Lambda执行前不会被销毁或替换,也可以捕获引用,避免拷贝开销:
// 先绑定引用,再捕获 auto& target_answer = this->content->currentStep->answers[i]; choices.back()->onClick([this, &target_answer] { decide(target_answer); }); // 捕获初始化写法 choices.back()->onClick([this, &answer = this->content->currentStep->answers[i]] { decide(answer); });
⚠️ 注意:如果后续answers容器被修改(比如扩容、删除元素),或者currentStep/content指向了其他对象,这个引用会变成悬空引用,触发未定义行为,所以只适合生命周期明确可控的场景。
内容的提问来源于stack exchange,提问作者user3808217
相关产品推荐
相关产品推荐

