【发布时间】:2014-06-23 05:53:38
【问题描述】:
根据http://en.cppreference.com/w/cpp/memory/unique_ptr/reset,
void reset( pointer ptr = pointer() );
template< class U >
void reset( U ) = delete;
void reset( std::nullptr_t p );
1) 给定
current_ptr,由*this管理的指针执行 按此顺序执行以下操作: 保存当前指针old_ptr = current_ptr的副本; 用参数current_ptr = ptr覆盖当前指针; 如果旧指针非空,则删除之前管理的对象if(old_ptr != nullptr) get_deleter()(old_ptr)。2) 在动态数组的特化中,
std::unique_ptr<T[]>, 提供此模板成员是为了防止将reset()与 指向派生的指针(这将导致未定义的行为 数组)。3) 在动态数组的特化中,
std::unique_ptr<T[]>, 第三次重载是必要的,以允许重置为nullptr(这将 否则被模板重载禁止)。相当于reset(pointer())
既然reset(nullptr)等价于reset(pointer()),那为什么还存在后者呢?
如果我想重置一个数组形式的 unique_ptr,为什么不能只使用rest(pointer())?
【问题讨论】:
-
我实际上发现
deleteion 的方法更有趣... -
因为
p.reset(nullptr)是一个编译错误会很愚蠢? -
请注意,
std::unique_ptr<T[]>仅接受T *和T *作为其构造函数和reset方法的指针类型。值得注意的是,它不接受指向不同于T的类型的指针,即使它们可以转换为指向T的指针。换句话说:没有那个重载p.reset(nullptr);将无法编译。那将是非常愚蠢的。 (出于同样的原因,有一个unique_ptr(nullptr_t)ctor。)
标签: c++ arrays c++11 overloading unique-ptr