【问题标题】:Can anybody explain this initializer code?任何人都可以解释这个初始化代码吗?
【发布时间】:2019-12-29 04:52:00
【问题描述】:

谁能解释“self_( this, []( ... ) {} )”的工作原理?

struct Parent {
    std::shared_ptr<Parent> self_;
    Parent() : self_( this, []( ... ) {} ) {}
    operator std::shared_ptr<Parent>() const { return self_; }
}

【问题讨论】:

  • 它没有——你传入了一个无操作删除器,所以你不妨只使用一个原始指针。
  • 它以某种方式工作,并正确填充_self(此示例from here)但我不明白,“,[](...){}”做什么......
  • 那个操作符不应该返回一个 shared_ptr 它应该返回一个weak_ponter。如果现在删除对象而其他共享指针存在,则这些共享指针将指向已删除的对象。
  • 请注意self_(也不是任何锁定的弱指针)不会让this保持活动状态。即使this 由共享指针管理,它们也会有不同的管理块。这是一个非常危险的设计选择……
  • 整个设计毫无意义。类保存指向自身的指针有什么意义?至少,该类应该从 std::enable_shared_from_this 派生,然后使用 [shared_from_this()]() 为自己创建外部 shared_ptr 对象。但不是为了一个内部的人

标签: c++ lambda this initializer


【解决方案1】:

谁能解释“self_( this, []( ... ) {} )”的工作原理?

self_Parent 的成员,是std::shared_ptr&lt;Parent&gt;

self_( this, []( ... ) {} )

使用带有两个参数的构造函数进行初始化:

(1) 共享指针this,指向包含self_(所以名字)的同一对象的指针

(2)self_对象被删除时调用的函数

观察函数:[]( ... ) {}

这是一个 lambda 函数,可以接受所有(...,旧 C 可变参数方式)并且什么都不做(主体为空)。

这样做(无操作删除器)是因为当最后一个具有特定值的共享指针被销毁时,无需对 this 指针执行任何操作。

【讨论】:

  • 感谢您的回答。现在变得更加清楚了。但是,还有一个问题——为什么需要这个“删除” lambda(即使它什么也不做)? (没有它的代码编译但产生运行时错误)
  • @SyCoDeR - 考虑一个共享指针:通常是在不同对象之间共享的已分配 (new) 值。因此,通常,当一个对象被销毁时,析构函数什么也不做,直到有另一个具有相同值的共享指针并删除(delete 运算符)包含删除最后一个共享指针的指针。在这种情况下,我们不希望值 this 被最后一个共享指针析构函数删除。
  • 是的,我现在明白了。即使这是共享 ptr,它也仅用于弱 ptr init。因此,我们没有其他的共享,只有自己。而且,如果没有这个空删除器,我们将遭受双重破坏……谢谢!
【解决方案2】:
[]( ... ) {}

这不过是 lambda 函数,格式如下

[捕获子句](参数)->返回类型
{
的定义 方法
}

Capture 子句:指定通过值或引用捕获和捕获哪些变量

Parameters: 输入参数列表,可以是 (int val1,int val2) 或 (...) 或任何内容,这只是一个示例

返回类型:lambda表达式的返回类型

[] : 空捕获子句意味着它什么都不捕获

(...) : 可变参数函数

{} : Lambda 主体,其中包含 lambda 函数代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多