Lambda中直接用this会报错,因默认不捕获this指针;需显式写[this]才能访问成员,但存在悬空指针风险;可用[*this]按值复制对象避免该问题。
this 会报错?因为 Lambda 默认不捕获任何外部变量,包括隐式的 this 指针。哪怕你在类的成员函数里定
义 Lambda,它也不会自动获得访问 this->member 的权限——编译器会报类似 error: 'this' was not captured for this lambda function 的错误。
[this] 捕获让 Lambda 能访问当前对象的所有非静态成员写 [this] 表示把当前对象的 this 指针以值方式捕获进闭包。之后你就能在 Lambda 体内自由使用 this->x、func()(等价于 this->func())、甚至 member_var(前提是该成员在作用域中可访问)。
[this] 会导致悬空指针 —— 这是最常见的崩溃根源[=] 或 [&] 同时出现(C++17 起标准禁止混合默认捕获与显式 this)class Widget {
int value = 42;
public:
auto get_lambda() {
return [this]() { return value * 2; }; // ✅ OK:[this] 捕获后可直接用 value
}
};[*this] 捕获整个对象副本(C++17 起)如果你需要 Lambda 独立持有对象状态,避免悬空风险,可以用 [*this]。它按值拷贝整个当前对象(调用复制构造函数),Lambda 内部所有成员访问都基于这份副本。
std::unique_ptr、禁用拷贝构造),[*this] 编译失败auto lambda = [*this]() {
return value + 100; // 访问的是副本中的 value,修改不影响原对象
};this 后的 const 正确性如果 Lambda 定义在 const 成员函数里,[this] 捕获得到的是 const Widget*,此时只能调用 const 成员函数、读取 mutable 成员或 const 数据成员。
mutable
[*this](副本是非 const 的)最麻烦的情况往往不是语法写错,而是对象提前析构后 Lambda 还拿着 this 去解引用 —— 这种问题在多线程或回调场景下极难复现和调试。