【问题标题】: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

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

【问题讨论】:

    标签: c++ c++11 g++


    【解决方案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;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多