[英]lambda capture member variable by this
要捕獲對象中的成員數據,lambda需要捕獲“ this”指針:
class A {
public:
void func() {
auto f = [this](){_b->do_something();};
_c->run(f); // asynchronized method
}
private:
B* _b;
C* _c;
};
有一個問題:當_c調用f時,A的對象可能是虛構的! 會_b->do_something();
變成不確定的行為?
利用shared_ptr
,然后在lambda中捕獲它。 現在,當您創建A
的實例時,您需要使用make_shared
來完成。 如果你繼承這是最好enable_shared_from_this
,然后你可以使用shared_from_this
在lambda捕獲迫使A
呆在身邊的足夠長的lambda來,而不需要具有對一個給定運行shared_ptr
其他地方。
您課程的第一部分將如下所示:
class A : std::enable_shared_from_this<A> {
public:
void func() {
auto self = shared_from_this();
auto f = [this, self](){_b.do_something();};
_c->run(f); // asynchronized method
}
從3.8對象生命
- [...]在對象的生存期結束之后,在重新使用或釋放對象所占用的存儲空間之前,可以使用任何指向該對象將要或將要位於的存儲位置的指針,但只能以有限的方式使用。 [...]該程序在以下情況下具有未定義的行為:
[...]
5.2指針用於訪問對象的非靜態數據成員或調用非靜態成員函數
所以是的,在已破壞的A中使用指向B的指針是UB。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.