C++ 为什么我不能删除唯一的\u ptr<;字符[]>;是否使用reset()?
当我有一个指向单个对象的唯一指针时,我可以使用C++ 为什么我不能删除唯一的\u ptr<;字符[]>;是否使用reset()?,c++,c++11,c++builder,unique-ptr,C++,C++11,C++builder,Unique Ptr,当我有一个指向单个对象的唯一指针时,我可以使用reset(): 错误消息是没有匹配的函数调用“重置” 这也失败了: std::unique_ptr<char[]> variable(new char[10]); variable.reset(nullptr); std::unique_ptr变量(新字符[10]); 变量重置(nullptr); 错误消息为无法初始化类型为“指针”(又名“char*”)的变量,该变量的左值类型为“”并且从不兼容的类型“\u Null\u ptr\u
reset()
:
错误消息是没有匹配的函数调用“重置”
这也失败了:
std::unique_ptr<char[]> variable(new char[10]);
variable.reset(nullptr);
std::unique_ptr变量(新字符[10]);
变量重置(nullptr);
错误消息为无法初始化类型为“指针”(又名“char*”)的变量,该变量的左值类型为“”
并且从不兼容的类型“\u Null\u ptr\u type”(又名“nullptr\t”)分配给“”
这包括:
std::unique_ptr<char[]> variable(new char[10]);
variable = nullptr;
std::unique_ptr变量(新字符[10]);
变量=nullptr;
相关代码来自
模板
使用\u Enable\u ctor\u reset=Enable\u if\t<
值是否相同
||(值是否相同
&&是指针::值
&&你是可兑换的吗<
移除指针(*)[],
元素类型(*)[]
>::价值)>;
_Myt&运算符=(\u Null\u ptr\u type)\u无例外
{//分配一个空指针
重置(指针());
返回(*本条);
}
_NOINLINE无效重置(_Null_ptr_type_ptr)_NOEXCEPT
{//建立新的空指针
指针_Old=this->_Myptr;
这个->\u Myptr=\u Ptr;
如果(_Old!=指针())
此->获取删除器()(\u Old);
}
模板
无效重置(Uty Ptr)\无例外
{//建立新指针
指针_Old=get();
这个->\u Myptr()=\u Ptr;
如果(_Old!=指针())
此->获取删除器()(\u Old);
}
这似乎是标准库中的一个bug,因为正如和在评论中指出的那样,相同的代码与其他编译器一起编译
C++11标准第20.7.1.3节(“具有运行时长度的数组对象的唯一ptr”)列出了带有以下签名的reset()
:
无效重置(指针p=pointer())无异常
第一个示例无法编译,因为标准库实现中缺少默认参数。第二个示例实质上调用了reset(pointer())
,但编译失败。此编译错误可能是未添加默认参数的原因
我已经向Embarcadero报告了一个错误:
据猜测,编译器不符合我的预期,在gcc上运行良好,因此您的编译器肯定存在某种问题。也许尝试联系C++ Builder公司?工作与GCC(C++ 11)编译器<代码>的Tynable,CyrTyReals<代码>看起来像某种代码> STD::Enable,如果< /Cord>:我很好奇看到代码落后,但是我想它禁用代码>重置< /代码>arrays@wasthishelpful我在问题上补充了这一点。
std::unique_ptr<char[]> variable(new char[10]);
variable.reset(nullptr);
std::unique_ptr<char[]> variable(new char[10]);
variable = nullptr;
template<class _Uty>
using _Enable_ctor_reset = enable_if_t<
is_same<_Uty, pointer>::value
|| (is_same<pointer, element_type *>::value
&& is_pointer<_Uty>::value
&& is_convertible<
remove_pointer_t<_Uty>(*)[],
element_type(*)[]
>::value)>;
_Myt& operator=(_Null_ptr_type) _NOEXCEPT
{ // assign a null pointer
reset(pointer());
return (*this);
}
_NOINLINE void reset(_Null_ptr_type _Ptr) _NOEXCEPT
{ // establish new null pointer
pointer _Old = this->_Myptr;
this->_Myptr = _Ptr;
if (_Old != pointer())
this->get_deleter()(_Old);
}
template<class _Uty,
class = _Enable_ctor_reset<_Uty> >
void reset(_Uty _Ptr) _NOEXCEPT
{ // establish new pointer
pointer _Old = get();
this->_Myptr() = _Ptr;
if (_Old != pointer())
this->get_deleter()(_Old);
}