Lambda中直接用this会报错,因默认不捕获this指针;需显式写[this]才能访问成员,但存在悬空指针风险;可用[*this]按值复制对象避免该问题。
![c++ lambda表达式中的捕获列表[this]作用?(在闭包中使用类的成员)](https://img.php.cn/upload/article/001/431/639/176793446296470.jpg)
为什么在 Lambda 里直接用 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(前提是该成员在作用域中可访问)。
- 它捕获的是指针本身,不是对象副本;Lambda 内对成员的修改会影响原对象
- 如果 Lambda 生命周期超过当前对象存在时间,
[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 内部所有成员访问都基于这份副本。
- 适用于 Lambda 需异步执行、且不希望受原对象生命周期影响的场景
- 注意:如果类不可复制(如含
std::unique_ptr、禁用拷贝构造),[*this]编译失败 - 性能开销取决于对象大小和拷贝成本,别盲目用
auto lambda = [*this]() {
return value + 100; // 访问的是副本中的 value,修改不影响原对象
};容易忽略的坑:捕获 this 后的 const 正确性
如果 Lambda 定义在 const 成员函数里,[this] 捕获得到的是 const Widget*,此时只能调用 const 成员函数、读取 mutable 成员或 const 数据成员。
立即学习“C++免费学习笔记(深入)”;
- 想在 const 成员函数里修改 Lambda 内部状态?得把对应变量声明为
mutable - 想调用非 const 成员函数?不行——除非你去掉 const 限定,或改用
[*this](副本是非 const 的) - 编译器不会帮你“绕过” const 正确性,这是有意为之的安全机制
最麻烦的情况往往不是语法写错,而是对象提前析构后 Lambda 还拿着 this 去解引用 —— 这种问题在多线程或回调场景下极难复现和调试。










