初始化 unique_ptr 的正确方法

Correct way of initializing a unique_ptr

正在学习如何在一般情况下使用智能指针和 C++...假设我有以下 class:

template<typename T>
class MyClass {
public:
  MyClass(const T& def_val)
private:
  std::unique_ptr<T> default_val;
};

如果我只想存储一个指向 T 类型对象的指针,其值在 default_val class 成员中,那么实现构造函数的惯用方法是什么?我的理解也是我根本不需要定义析构函数,因为 unique_ptr 会自动清理自身?

按照您编写代码的方式,MyClass 只能存储指向构造函数参数的 副本 的唯一指针:

MyClass::MyClass(const T& def_val)
: default_val(new T(def_val))
{
}

这意味着 T 必须是可复制构造的。

My understanding is also that I don't have to define a destructor at all, since the unique_ptr will automatically taking care of cleaning up itself?

正确。这是 unique_ptr 的两个主要目的之一,第二个是保证它只有一个所有者。

如果您使用的是 C++11,您还可以添加一个接受右值引用的构造函数

template<typename T>
class MyClass {
public:
  MyClass(T&& def_val) : default_val(new T(std::move(def_val))) {}
  MyClass::MyClass(const T& def_val) : default_val(new T(def_val)) {}
private:
  std::unique_ptr<T> default_val;
};

现在您接受 const ref、生成副本或临时文件