c++ unique_ptr 移动构造函数

c++ unique_ptr move constructor

在另一个 post 中提到,由于删除器类型不同,这不起作用。

std::unique_ptr<char[]> ptr(nullptr);
std::unique_ptr<const char[]> ptr_2(std::move(ptr));

但在 VSS2013 中没有实现此行为的解决方案。有人知道一个简短而干净的解决方案吗?

编辑::

std::unique_ptr<const char[]> ptr_2(ptr.release());

不起作用,编译时出现错误:

error C2280: 'std::unique_ptr<const char [],std::default_delete<_Ty>>::unique_ptr<char*>(_Ptr2)' : attempting to reference a deleted function
1>          with
1>          [
1>              _Ty=const char []
1>  ,            _Ptr2=char *
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\memory(1612) : see declaration of 'std::unique_ptr<const char [],std::default_delete<_Ty>>::unique_ptr'
1>          with
1>          [
1>              _Ty=const char []
1>          ]

当然,只需避免移动并手动执行即可:

std::unique_ptr<char[]> ptr(nullptr);
std::unique_ptr<const char[]> ptr_2(ptr.release());

您随时可以发布:

std::unique_ptr<const char[]> ptr_2(ptr.release());

但请务必添加评论,指出为什么简单的移动不起作用。

直截了当的 release 答案无法编译,因为 Visual Studio 将另一个指针类型 template<class _Ptr2> explicit unique_ptr(_Ptr2) 的构造函数定义为 private,因此您必须这样做:

std::unique_ptr<const char[]> ptr_2(const_cast<const char*>(ptr.release()));

使指针类型匹配。

已发布的 C++ 标准中的措辞表明,unique_ptr<T[]> 不允许涉及 const 限定更改的转换。这是一个缺陷,DR 2118, which was resolved by the changes in N4089

较旧的编译器可能不执行新规则(我为 GCC 4.8 执行了早期版本的修复程序,但 GCC 在此之前也不支持它)。