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 reference或Microsoft不同的示例),我注意到它们使用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:两种版本都可以正常编译,而专用版本则无法工作,这使其成为一种非常讨厌的错误。
编辑:更改struct为class。Cpp参考实际上在其示例中使用了公共继承。尽管如此,没有任何话说它必须是公开的。它实际上在那里列出,我只需要学习仔细阅读。谢谢@Angew。
的典型实现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 ++标准提到了这样的实现:
[注意:可能的实现如下所示:
Run Code Online (Sandbox Code Playgroud)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); } };
shared_ptr创建唯一指针的构造函数可以检测到某个enable_shared_from_this基础的存在,并将新创建的基础分配shared_ptr给其__weak_this成员。—尾注]
您链接到的cppreference页面也在注释中提到了这一点。
| 归档时间: |
|
| 查看次数: |
925 次 |
| 最近记录: |