capture by value class members

两盒软妹~` 提交于 2019-12-03 06:41:40

问题


Is there a way, when writing a lambda function within a member function, to capture fields of the enclosing class by value? The default catch-all = doesn't work because when I reference the variable inside the lambda I get instead a dereferencing from the captured this pointer, as well as explicitly naming the variable in the capture list, because I get two compile error: capture of non-variable <name>, and ‘this’ was not captured for this lambda function


回答1:


No, data members cannot be captured by value. A lambda can capture only two kinds of things:

  1. the this pointer, and
  2. nonstatic local variables (that is, variables with automatic storage duration).

As has been noted by ildjarn in the comments, you can create a local variable with a copy of the value of the data member, and capture that local variable by value.

I would argue that if explicit by-value capture of a data member was allowed, it could prove confusing, since the behavior of explicit capture would differ from that of implicit capture. For example, given an accessible data member of type int named m, it would be odd that the following would produce different results:

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



回答2:


Yes, simply write the [<new name>=<your class field>] construct. For instance:

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

        my_lambda();
    }
}



回答3:


C++ is a language of speed, and one of most important things in design of the language is performance. If standard designers want to implement an idiom a way to capture all variables of a class by value, think of a really huge class and say me do you want to capture them all by value? even to capture all variables that declared in a function(including this) there is 2 way:

  • by value: variables that defined in a function, leave in stack so they can't be multi megabytes but classes that use heap like vector can still be huge. So take care for using this!

  • by reference: that actually save stack pointer.

So you see there is no efficient way to capture all variables of a class with value, but you can make a local copy of that class in your function and then capture it by reference!



来源:https://stackoverflow.com/questions/12944002/capture-by-value-class-members

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!