在 c++11 中按值捕获成员变量的好方法是什么?

use*_*129 6 c++ g++ c++11

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();
Run Code Online (Sandbox Code Playgroud)

这段代码将在 gcc 4.6.3 中编译,它会做正确的事情来制作成员变量的副本z,并且两个 print 都会得到2. 在 gcc 4.8.2 这不再编译..

error: 'this' was not captured for this lambda function
Run Code Online (Sandbox Code Playgroud)

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

vso*_*tco 7

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

auto px = [v = this->z]() // capture by value just ONE member variable
{ 
        std::cout << v << std::endl;
};
Run Code Online (Sandbox Code Playgroud)

例子:

#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();
}
Run Code Online (Sandbox Code Playgroud)

Live on Coliru

  • 解决方法:`auto z = this-&gt;z; 自动 px = [z] { ... };`。 (3认同)