我的Lambda在复制构建期间未正确转换捕获的“ this”

bra*_*ing 3 c++ lambda

我已将问题缩小为

#include <iostream>
#include <functional>

struct Foo {
    std::function<Foo*()> lambda;
    Foo()
        :lambda([this](){return this;})
    {}

};

int main(){

    Foo a;
    Foo b = a; 
    std::cout << &a << " " << a.lambda() << std::endl;
    std::cout << &b << " " << b.lambda() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出在哪里

0x7ffd9128b8a0 0x7ffd9128b8a0
0x7ffd9128b880 0x7ffd9128b8a0
Run Code Online (Sandbox Code Playgroud)

我最初希望这this将始终指向拥有lambda的实例。但是我忘记了复制构造。在这种情况下,lambda会捕获this,然后被固定,并且无论lambda被复制了多少次,它都指向的原始值this

有没有办法解决此问题,以便this即使在拥有对象的复制构造下,lambda总是对其拥有对象的引用。

lub*_*bgr 9

听起来您需要提供自己的特殊成员函数,不是吗?例如,对于复制构造函数:

Foo(const Foo& other)
   :lambda([this](){return this;})
{}
Run Code Online (Sandbox Code Playgroud)