【发布时间】:2021-10-10 14:32:39
【问题描述】:
假设我有以下抽象类 A。现在我正在尝试从 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 );
}
我在另一篇文章中读到这与明确的 shared_ptr 函数有关,其中参数 p 必须严格为 Y* 类型。在这种情况下,Y 引用 A 类,所以通过传入“this”,“this”不是因为它的类型为 A* 就已经足够明确了吗?我知道解决方案是使用 std::enable_shared_from_this 但我只想了解为什么这不起作用。例如,如果我们执行以下操作,它将起作用
ext::shared_ptr<A>(new A())
但是 new A() 不返回与 "this" 相同的类型吗?(都返回指向 A 的指针)那么为什么 new 可以工作而不是 "this"?
【问题讨论】:
-
这是个坏主意。您不能将
*this的所有权移交给shared_ptr;这会让它的真正主人非常恼火。 -
ext::shared_ptr<A>(this);永远不会是正确的。您不能创建指向随机指针的共享指针并期望它正常工作。你应该使用enabled_shared_from_this。 -
@SergeyA 这很少是正确的,即使是,也有很大的代码味道,但 从不 不准确。在某些情况下以这种方式执行所有权转移是绝对可能的(想到与某些异步 C 库互操作)。
-
@Frank 这不是正确的代码 :) 在非常狭窄的情况下,该操作可能是有效的 :)
标签: c++ templates boost shared-ptr explicit