繁体   English   中英

lambda捕获成员变量由此

[英]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对象生命

  1. [...]在对象的生存期结束之后,在重新使用或释放​​对象所占用的存储空间之前,可以使用任何指向该对象将要或将要位于的存储位置的指针,但只能以有限的方式使用。 [...]该程序在以下情况下具有未定义的行为:

[...]

5.2指针用于访问对象的非静态数据成员或调用非静态成员函数

所以是的,在已破坏的A中使用指向B的指针是UB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM