在提到的另一篇文章中,由于不同的删除类型,这不起作用。
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> ]
答案 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());
但请务必添加评论,指出为什么简单的举措不起作用。