c ++ unique_ptr移动构造函数

时间:2015-08-19 09:58:47

标签: c++ c++11 visual-studio-2013 smart-pointers

在提到的另一篇文章中,由于不同的删除类型,这不起作用。

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>          ]

4 个答案:

答案 0 :(得分:4)

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

较旧的编译器可能没有实现新规则(我为GCC 4.8实现了早期版本的修复,但GCC在此之前也没有支持它。)

答案 1 :(得分:3)

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

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

使指针类型匹配。

答案 2 :(得分:0)

当然,只需避免移动并手动完成:

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

答案 3 :(得分:0)

您可以随时发布:

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

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