shared_from_this和私有继承

Art*_*ind 6 c++ visual-studio-2015

CPP参考具有如何使用本示例std::enable_shared_from_this(略作调整)

class Good : std::enable_shared_from_this<Good>
{
    public: std::shared_ptr<Good> getptr() { return shared_from_this(); }
};

...

auto good = std::make_shared<Good>();
good->getptr();
Run Code Online (Sandbox Code Playgroud)

但是,这在Visual Studio 2015(企业版14.0.25123.00更新2)中不起作用,即std::bad_weak_ptr引发异常。

查看其他示例(包括与cpp referenceMicrosoft不同的示例),我注意到它们使用public继承而不是继承private。使用public继承实际上可以解决我的问题(std::bad_weak_ptr不再是有效的shared_ptr替代了)。

Cpp参考没有提到我必须公开继承std::enable_shared_from_this,所以错误在哪里?Visual Studio的行为是否错误(我猜想在使用private继承时存在可见性问题)还是cpp引用未提及此限制?

PS:make_shared<good>()或者shared_ptr<Good>(new Good)没有什么关系。

PSS:两种版本都可以正常编译,而专用版本则无法工作,这使其成为一种非常讨厌的错误。

编辑:更改structclass。Cpp参考实际上在其示例中使用了公共继承。尽管如此,没有任何话说它必须是公开的。它实际上在那里列出,我只需要学习仔细阅读。谢谢@Angew。

San*_*ker 5

的典型实现std::enable_shared_from_this要求std::shared_ptr构造函数(std::make_shared在您的情况下称为)必须能够检测到某个std::enable_shared_from_this碱基的存在,因此可以设置该std::weak_ptr碱基的成员。

对于私有继承,这是不可能的,因此您将获得调用时遇到的运行时异常shared_from_this(因为std::weak_ptr从未设置,因为std::shared_ptr构造函数无法检测到std::enable_shared_from_this基数)。

C ++标准提到了这样的实现:

[注意:可能的实现如下所示:

template<class T> class enable_shared_from_this {
private:
  weak_ptr<T> __weak_this;
protected:
  constexpr enable_shared_from_this() : __weak_this() { }
  enable_shared_from_this(enable_shared_from_this const &) { }
  enable_shared_from_this& operator=(enable_shared_from_this const &) { return *this; }
  ~enable_shared_from_this() { }
public:
  shared_ptr<T> shared_from_this() { return shared_ptr<T>(__weak_this); }
  shared_ptr<T const> shared_from_this() const { return shared_ptr<T const>(__weak_this); }
};
Run Code Online (Sandbox Code Playgroud)

shared_ptr创建唯一指针的构造函数可以检测到某个enable_shared_from_this基础的存在,并将新创建的基础分配shared_ptr给其__weak_this成员。—尾注]

您链接到的cppreference页面也在注释中提到了这一点。