为什么 std::unique_ptr 不允许自身可复制?

gmm*_*mmk 1 c++ stl

我知道这是为了防止 unique_ptr 的两个副本有一个可能的悬空指针,其中指向的对象可能已经被释放以及类似的东西。但为什么他们不决定允许一种深度复制,而不是仅仅复制指针,而是分配新内存并将副本委托给 unique_ptr 的模板参数类型。

Chr*_*odd 5

主要问题是,如果对象实际上是子类,那么盲目地用 new 调用模板参数的复制构造函数就会对对象进行切片,这通常是一件非常不安全的事情。

也就是说,我发现扩展 unique_ptr 很有用:

template<class T, class D = std::default_delete<T>>
class autoclone_ptr : public std::unique_ptr<T, D> {
 public:
    autoclone_ptr() = default;
    autoclone_ptr(autoclone_ptr &&) = default;
    autoclone_ptr &operator=(autoclone_ptr &&) = default;
    autoclone_ptr(const autoclone_ptr &a) : std::unique_ptr<T,D>(a ? a->clone() : nullptr) {}
    autoclone_ptr &operator=(const autoclone_ptr &a) {
        auto *t = a.get();
        this->reset(t ? t->clone() : nullptr);
        return *this; }
};
Run Code Online (Sandbox Code Playgroud)

这只能针对定义了clone()避免切片问题的方法的类进行实例化。