通过捕获值类成员(capture by value class members)

2019-08-01 14:17发布

有没有一种方法,一个成员函数中写一个lambda功能时,按值来捕捉封装类的字段? 默认包罗万象=不工作,因为当我引用拉姆达内部变量,我得到,而不是从捕获这个指针引用,以及明确命名的捕获列表中的变量,因为我得到两个编译错误: capture of non-variable <name> ,和'this' was not captured for this lambda function

Answer 1:

不,数据成员不能被捕获价值。 一个lambda可以捕捉只有两种东西:

  1. this指针,
  2. 非静态本地变量(即,具有自动存储时间变量)。

如已通过ildjarn在评论中指出,你可以创建一个局部变量的数据成员的值的副本,并通过值捕捉局部变量。

我认为, 如果一个数据成员的明确的价值捕获是允许的,它可以证明混乱,因为明确的捕捉行为会从隐性捕获的不同。 例如,给定的类型的可访问的数据成员int命名m ,这将是奇怪的是,以下将产生不同的结果:

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


Answer 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();
    }
}


Answer 3:

C ++是速度的一种语言,在语言的设计,最重要的事情之一就是性能。 如果标准的设计师希望实现一个成语的方式通过值来捕获类的所有变量,认为一个真正巨大的类,并说要通过值来捕获所有这些我做什么? 甚至捕捉到,在一个函数(包括声明的所有变量this )有2路:

  • 按值:在函数中定义的变量,留在堆栈,使他们不能多兆,但使用的堆状类vector仍然是巨大的。 所以要小心使用此!

  • 引用:实际节约堆栈指针。

所以你看有捕获类的所有变量与价值没有有效的方法,但你可以使类的本地副本在你的函数,然后通过参考捕捉到它!



文章来源: capture by value class members