我在限定在局部靜態變量的λ,並將其存儲的類的功能:什麼時候在lambda中捕獲「this」?
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'的調用將會調用未定義的行爲並且很可能崩潰。 – Xirema
@Xirema這是非常真實的,但我不認爲這是他想要得到的行爲。 –
我明白'靜態'的語義,我試圖弄清楚的是,如果lambda「承諾」捕獲'this * * *以後*,或者如果它被捕獲*正確然後*。不過,您在回覆中確實解決了這個問題。我希望lambda的容器是靜態的,但不是捕獲的。我希望他們在定義和調用之間分開。 –