我的类中有一个函数,它定义了一个 lambda 并将其存储在本地静态变量中:
class A
{
public:
void call_print()
{
static auto const print_func = [this] {
print();
};
print_func();
};
virtual void print()
{
std::cout << "A::print()\n";
}
};
class B : public A
{
public:
virtual void print() override
{
std::cout << "B::print()\n";
}
};
我也执行以下测试:
int main()
{
A a;
B b;
a.call_print();
b.call_print();
}
我期望被打印出来的内容是:
(实时示例)
A::print()
B::print()
但是真正得到的是:
A::print()
A::print()
(每次打印时,也会显示相同的对象地址)
我怀疑这是由于 this
捕获引起的。我以为它会捕获调用时的 this
值,但似乎捕获的是 lambda 定义时的值。
有人能解释一下 lambda 捕获的语义吗?它们实际上是什么时候提供给函数的?对于所有捕获类型都是这样的吗,还是 this
是一个特殊情况?去掉 static
可以解决问题,但在我的生产代码中,我实际上是将 lambda 存储在稍微重一些的对象中,该对象表示稍后要插入信号的插槽。
a
被删除,未来对call_print
的调用将会引发未定义行为,并很可能导致崩溃。 - Xiremastruct S { int i; }; static const S s { 42 };
,每次都期望s.i
不同。 - Oktalistthis
捕获会是一个特殊情况,可能是因为调用实际上可以发生在类本身之外,所以后来无法捕获this
。感谢您提供示例进行澄清。 - void.pointer