捕获this指针可让lambda访问类成员,[this]按值捕获指针并具有引用语义,[=]和[&]隐式包含this,需注意对象生命周期避免悬空指针。

在C++中,lambda表达式可以捕获当前对象的 this 指针,从而访问类的成员变量和成员函数。这在类的成员函数中定义lambda时非常常见,尤其适用于回调、异步操作或STL算法中需要访问对象内部状态的场景。
在lambda的捕获列表中使用 this,即可将当前对象的指针捕获。捕获后,lambda内部可以直接访问类的非静态成员。
class MyClass {
int value = 42;
public:
void func() {
auto lambda = [this]() {
std::cout << value << std::endl; // 可直接访问成员变量
};
lambda();
}
};
在这个例子中,[this] 显式捕获了当前对象的指针,lambda因此能访问 value 成员。
this 捕获的是指向当前对象的指针,本质上是按值捕获指针本身,但通过该指针可以修改对象的成员,所以具有“引用语义”。
立即学习“C++免费学习笔记(深入)”;
注意:[=] 和 [&] 都会自动包含对 this 的捕获,不需要重复写 [this]。
class DataProcessor {
std::vector<int> data{1, 2, 3, 4, 5};
int offset = 10;
public:
void process() {
std::for_each(data.begin(), data.end(), [this](int x) {
std::cout << (x + offset) << " ";
});
std::cout << std::endl;
}
};
这里lambda通过 [this] 访问了 offset 成员,实现自定义处理逻辑。
lambda捕获了 this 指针后,如果该lambda被保存并在对象销毁后调用,会导致悬空指针和未定义行为。
例如:
std::function<void()> dangerousLambda;
class BadExample {
int val = 100;
public:
void makeLambda() {
dangerousLambda = [this]() { std::cout << val; };
}
};
// 若对象销毁后调用 dangerousLambda,则崩溃
解决方法:考虑使用 shared_from_this(继承 std::enable_shared_from_this)来管理生命周期,或改用值捕获关键数据。
基本上就这些。正确使用 [this] 捕获能让lambda更灵活地操作对象成员,但务必注意对象生命周期的匹配。不复杂但容易忽略。
以上就是c++++中lambda表达式如何捕获this指针_c++ lambda捕获this的语法与应用的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号