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 在此之前也不支持它)。
在另一个 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 在此之前也不支持它)。