Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我不能删除唯一的\u ptr<;字符[]>;是否使用reset()?_C++_C++11_C++builder_Unique Ptr - Fatal编程技术网

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);
    }