将auto_ptr赋值给weak_ptr

Assign auto_ptr to weak_ptr

本文关键字:ptr weak 赋值 auto      更新时间:2023-10-16

我还在探索c++ 11。所以我很确定我做错了什么。但我就是想不出问题所在。

我有以下代码:

MyClass::MyClass(const PlayerEventListener* eventListener)
{
   weak_ptr<PlayerEventListener> _listener;
   std::auto_ptr<PlayerEventListener> autoPtr;
   autoPtr.reset(const_cast<PlayerEventListener*> (eventListener));
   // I get error for this line
   _listener = autoPtr;
}
No viable overloaded '='

但是下面的代码可以很好地编译:

MyClass::MyClass(const PlayerEventListener* eventListener)
{
   weak_ptr<PlayerEventListener> _listener;
   std::shared_ptr<PlayerEventListener> sharedPtr;
   sharedPtr.reset(const_cast<PlayerEventListener*> (eventListener));
   // I get error for this line
   _listener = sharedPtr;
}

谁能解释为什么我不能转换一个自动指针弱指针?

weak_ptr是一个对象,它保存着对shared_ptr(而不是auto_ptr)实际持有的对象的安全引用。因此,在weak_ptr的实现中,没有任何重载的operator=可以提供将auto_ptr赋值给weak_ptr。可以通过编译这个示例代码并查看错误

来验证它。
In constructor 'MyClass::MyClass(const PlayerEventListener*)':
21:14: error: no match for 'operator=' (operand types are 'std::weak_ptr<PlayerEventListener>' and 'std::auto_ptr<PlayerEventListener>')

请记住:根据http://www.cplusplus.com/reference/memory/auto_ptr/:

这个类模板(auto_ptr)在c++ 11中已弃用。unique_ptr是一个新的具有类似功能的工具,但具有改进的安全性(no(假副本分配),增加了功能(删除器)和支持数组。更多信息请参见unique_ptr