c++ - 为什么数据成员不能在 lambda 捕获列表中

标签 c++ c++11 lambda

我有一个类 foo,它具有 bar 作为成员变量。

在该类的另一个成员函数中,我正在编写一个 lambda 函数:

[bar](void){}

但我不能在捕获列表中包含 bar。这是为什么呢?

最佳答案

只有具有自动存储持续时间的对象才能被 C++11 中的 lambda 捕获(即局部变量和函数参数)。如果您想要捕获 non-static 类数据成员的效果,您可以捕获 this 指针,如 Danvil's answer :

auto f = [this]{ std::cout << a << std::endl; };

或将数据成员的值缓存在局部变量中并捕获:

auto a = this->a;
auto f = [a]{ std::cout << a << std::endl; };

在 C++14 中会更简洁:

auto f = [a = this->a]{ std::cout << a << std::endl; };

这两个选项之间的选择取决于您是要存储 a 的值 现在 还是要检索值 a当 lambda 被调用时。请注意,在捕获 this 的情况下,您必须确保指针对象的生命周期包含 lambda 的生命周期,在对象被销毁后对 lambda 的调用具有未定义的行为。捕获 a 拷贝的更简单的情况是完全独立的,没有这样的生命周期问题。

关于c++ - 为什么数据成员不能在 lambda 捕获列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23803152/

相关文章:

c++ - 如何在特定内存位置设置C中函数的地址

c++ - 使用 boost.hana 内省(introspection)结构定义

c++ - g++ 无法解析模板函数重载

c++ - 正确使用boost lambda

c++ - constexpr 构造函数的参数类型 'std::function' 不是文字类型

C++14 结合通用 lambda 和变量模板

c# - lambda 表达式中不可能的值

c++ - 在 Thrust 的仿函数中使用附加数据字段的最佳方式是什么?

c++ - 如何避免 C++ 中的许多静态强制转换和 nullptr 检查?

c++ - 如何在 Visual Studio 中处理 noexcept