在c ++ 11中按值捕获成员变量的好方法是啥? [复制]

Posted

技术标签:

【中文标题】在c ++ 11中按值捕获成员变量的好方法是啥? [复制]【英文标题】:What's a good way to capture member variable by value in c++11? [duplicate]在c ++ 11中按值捕获成员变量的好方法是什么? [复制] 【发布时间】:2016-02-05 18:50:37 【问题描述】:
struct myclass 
    myclass()
    myclass(int qx):z(qx)   
    std::function<void()> create() 
        auto px = [z]()
            std::cout << z << std::endl;
        ;
        return px;
    
    int z;
;

myclass my;
my.z = 2;
auto func = my.create();
func();
my.z = 3;
func();

这段代码将在 gcc 4.6.3 中编译,它会正确地复制成员变量z,并且两个打印都会得到2。在 gcc 4.8.2 中,这不再编译了..

error: 'this' was not captured for this lambda function

我想知道为什么这个功能被删除了,因为它非常有用。

【问题讨论】:

【参考方案1】:

我认为您不能直接在 C++11 中执行此操作(有关解决方法,请参阅@Nawaz 的评论)。但是,C++14 在这种情况下正好有帮助,通过generalized lambda captures:

auto px = [v = this->z]() // capture by value just ONE member variable
 
        std::cout << v << std::endl;
;

例子:

#include <functional>
#include <iostream>

struct myclass 
    myclass(): z 
    myclass(int qx): z(qx)    
    std::function<void()> create() 
        auto px = [v = this->z]() 
            std::cout << v << std::endl;
        ;
        return px;
    
    int z;
;

int main()

    myclass my;
    my.z = 2;
    auto func = my.create();
    func();
    my.z = 3;
    func();

Live on Coliru

【讨论】:

解决方法:auto z = this-&gt;z; auto px = [z] ... ;. @Nawaz 是的,确实,谢谢。【参考方案2】:

Lambda 只能捕获声明它们的本地范围的成员。它们无法通过复制或引用来捕获成员变量。

但是,C++14 的广义 lambda 捕获可以完成工作:

auto px = [z = z]()
    std::cout << z << std::endl;
;

您可以使用this-&gt;z 限定内部z,以明确您在做什么。

如果 C++14 不可用,您可以通过在函数中创建一个临时变量来显式捕获该变量,该变量将被捕获:

auto z = this->z;
auto px = [z]()
    std::cout << z << std::endl;
;

【讨论】:

以上是关于在c ++ 11中按值捕获成员变量的好方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在lambda中按值捕获`this`和局部变量?

C ++ 11 lambda捕获`this`并按值捕获局部变量

在python中按值删除字典项的最佳方法是啥? [复制]

在 lambda 中,引用的按值捕获是不是会复制底层对象?

在 Ruby 中按值传递是啥意思? [复制]

在 C 中按值调用