如果我要自己写,我想我会做些类似的事情:
template<typename T, typename Dtor = std::default_delete<T> >
class Uptr : private Dtor {
T* vl_;
public:
explicit Uptr(T* vl = nullptr) noexcept : vl_(vl) {}
~Uptr() noexcept { Dtor::operator()(vl_); }
Uptr& swap(Uptr& o) noexcept { T* tmp; tmp = vl_; vl_=o.vl_; o.vl_ = tmp; }
Uptr& operator=(Uptr&& o) noexcept { o.swap(*this); }
Uptr& operator=(nullptr_t) noexcept { vl_=nullptr; return *this; }
Uptr(Uptr&& o) noexcept : Uptr(nullptr) { *this = std::move(o); }
Uptr(const Uptr& o) = delete;
Uptr& operator=(const Uptr& o) = delete;
operator T*() noexcept { return vl_; }
operator const T*() const noexcept { return vl_; }
T* release() noexcept { T* ret = vl_; vl_=nullptr; return ret; }
const Dtor& deleter() const noexcept { return *(static_cast<Dtor*>(this)); }
Dtor& deleter() noexcept { return *(static_cast<Dtor*>(this)); }
};
而从不必定义拯救自己get()
和运营商*
,->
以及[]
。
在这种情况下进行隐式转换有什么问题?
我认为您的问题不是特定于的unique_ptr
,而是一般来说是关于智能指针的。
赫伯·萨特(Herb Sutter)很久以前就写过这本书。显然,它将允许您编写逻辑错误的代码,例如:
unique_ptr<something> p;
...
delete p; // p is a smart pointer - probably not what you want.
和其他类似的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句