按价值类成员捕获

时间:2012-10-17 21:52:00

标签: c++ lambda c++11 closures

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

3 个答案:

答案 0 :(得分:30)

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

  1. this指针和
  2. 非静态局部变量(即具有自动存储持续时间的变量)。
  3. 正如评论中ildjarn所指出的那样,您可以创建一个带有数据成员值副本的局部变量,并按值捕获该局部变量。

    我认为如果允许显式按值捕获数据成员,则可能会造成混淆,因为显式捕获的行为与隐式捕获的行为不同。例如,给定一个名为int的{​​{1}}类型的可访问数据成员,以下将产生不同结果将是奇怪的:

    m

答案 1 :(得分:2)

是的,只需编写[<new name>=<your class field>]构造即可。 例如:

class MyClass {
    int a;
    void foo() {
        auto my_lambda = [a_by_val=a] {
            // do something with a_by_val
        }

        my_lambda();
    }
}

答案 2 :(得分:-5)

C ++是一种速度语言,语言设计中最重要的一点是性能。如果标准设计师想要实现一种习惯用法来捕捉一个类的所有变量的方法,那么想想一个真正庞大的类,并说我想要按值来捕获它们吗?甚至捕获函数中声明的所有变量(包括this)都有两种方式:

  • by value:在函数中定义的变量,留在堆栈中,因此它们不能是多兆字节,但使用像vector这样的堆的类仍然可能很大。所以要小心使用它!

  • 引用:实际上是保存堆栈指针。

所以你看到没有有效的方法来捕获具有值的类的所有变量,但是你可以在函数中创建该类的本地副本,然后通过引用捕获它!