c++ - 按值类成员捕获

标签 c++ lambda c++11 closures

在成员函数中编写 lambda 函数时,有没有办法按值捕获封闭类的字段?默认包罗万象 =不起作用,因为当我在 lambda 中引用变量时,我会从捕获的 this 指针中解引用,并在捕获列表中显式命名变量,因为我得到两个编译错误:capture of non-variable <name> , 和 ‘this’ was not captured for this lambda function

最佳答案

不,不能按值捕获数据成员。一个 lambda 只能捕获两种东西:

  1. this 指针,以及
  2. 非静态局部变量(即具有自动存储期限的变量)。

正如 ildjarn 在评论中所指出的,您可以使用数据成员的值的拷贝创建一个局部变量,并按值捕获该局部变量。

我认为如果允许对数据成员进行显式按值捕获,这可能会令人困惑,因为显式捕获的行为与隐式捕获的行为不同。例如,给定一个名为 mint 类型的可访问数据成员,以下会产生不同的结果会很奇怪:

[=] () mutable { m = 1; } // we modify this->m
[=m]() mutable { m = 1; } // we modify the copy of m that was captured

关于c++ - 按值类成员捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12944002/

相关文章:

c++ - Eclipse 乱七八糟的系统和本地头文件?

c++ - 为 Windows 7 开发设置为 32 位

c++ - 当类可以转换为函数类型时函数如何重载

c++ - 在 C++ 中从输入函数获取参数类型的模板函数出错?

c++ - 为什么要把 std::lock 放在 std::lock_guard 之前

c++ - 将指针的类型写入其他模板类型的成员数据

c++ - 替换 std::vector 中的 shared_ptr 元素

c++ - 如何在 C++ 中实现多维映射的常量正确性

c# - 使用 Lambda 或 LINQ 将一个类列表转换或映射到另一个类列表?

c++ - 如何从 C++11 匿名函数内部访问局部变量?