我已将问题缩小为
#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总是对其拥有对象的引用。
听起来您需要提供自己的特殊成员函数,不是吗?例如,对于复制构造函数:
Foo(const Foo& other)
:lambda([this](){return this;})
{}
Run Code Online (Sandbox Code Playgroud)