繁体   English   中英

为什么我不能删除unique_ptr <char[]> 用reset()?

[英]Why cannot I delete unique_ptr<char[]> with reset()?

当我有一个指向单个对象的唯一指针时,我可以使用reset()删除它:

std::unique_ptr<char> variable(new char);
variable.reset();

但是,这对包含数组的std::unique_ptr不起作用。 为什么? 删除这样的指针的正确方法是什么?

我正在使用Embarcadero C ++ Builder 10.1。 相关标准是C ++ 11。

我的观察

当我有一个包含数组的唯一指针时,无法编译:

std::unique_ptr<char[]> variable(new char[10]);
variable.reset();

错误消息no matching function to call for 'reset'

这也失败了:

std::unique_ptr<char[]> variable(new char[10]);
variable.reset(nullptr);

错误消息cannot initialize a variable of type 'pointer' (aka 'char *') with an lvalue of type '<bound member function type>'assigning to '<bound member function type>' from incompatible type '_Null_ptr_type' (aka 'nullptr_t')

这编译:

std::unique_ptr<char[]> variable(new char[10]);
variable = nullptr;

来自<memory>的相关代码

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

似乎这是标准库中的一个错误,因为相同的代码与其他编译器编译,正如deW1sanjay在评论中指出的那样。

C ++ 11标准的第20.7.1.3节( “具有运行时长度的数组对象的unique_ptr” )列出了带有以下签名的reset()

void reset(指针p =指针())noexcept;

第一个示例无法编译,因为标准库实现中缺少默认参数。 第二个例子本质上调用reset(pointer()) ,它无法编译。 可能这个编译错误是没有添加默认参数的原因。

我向Embarcadero做了一个错误报告:

RSP-16165在包含unique_ptr的数组对象上调用reset()时编译错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM