У меня есть функция в классе, которая определяет лямбда и сохраняет ее в локальной статической переменной:
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
, когда он вызывается, однако он кажется захваченным в момент определения лямбда.
Может ли кто-нибудь объяснить семантику лямбда-захватов? Когда они действительно получают функцию? Это то же самое для всех типов захвата, или есть this
специальный случай? Удаление static
устраняет проблему, однако в моем производственном коде я фактически храню лямбда в немного более тяжелом объекте, который представляет собой слот, в который я вставляю сигнал позже.