无法由此创建 boost::shared_ptr

Can't created a boost::shared_ptr from this

假设我有以下摘要 Class A。现在我正在尝试从 Class A 内部创建一个 shared_ptr 到 A。所以在 A 中我有以下功能:

class A {
    void A::setupArguments() const {
            ext::shared_ptr<A> ptr = ext::shared_ptr<A>(this);
        }
}

编译时报错

Error   C2440   'initializing': cannot convert from 'Y *' to 'A *

当shared_ptr函数定义为:

template<class Y>
explicit shared_ptr( Y * p ): px( p ), pn() // Y must be complete
{
   boost::detail::sp_pointer_construct( this, p, pn );
 }

我在另一个 post 中读到,这与 shared_ptr 函数是显式的有关,其中参数 p 必须严格属于 Y* 类型。在这种情况下,Y 引用 Class A,因此通过传入“this”,“this”是否已经足够明确,因为它是 A* 类型?我知道解决方案是使用 std::enable_shared_from_this 但我只是想了解为什么这行不通。例如,如果我们执行以下操作,它将起作用

ext::shared_ptr<A>(new A())

但是 new A() return 不是与“this”相同的类型吗?(两者都是 returns 指向 A 的指针)那么为什么 new A() return 工作而不是“this”?

由于 setupArgumentsconst 限定函数,因此 thisconst A* 类型。并且 const A* 不能转换为 A* 所以编译失败。

您需要使用 shared_ptr<const A> 或删除 const 限定符。

给出的完整错误应该如下所示:

error C2440: 'initializing': cannot convert from 'Y *' to 'A *'
        with
        [
            Y=const A
        ]
note: Conversion loses qualifiers

OT:小心从 this 构造 shared_ptr,因为它可能导致双重删除。考虑使用 boost::enable_shared_from_this