C++11 初始化唯一\u ptr的正确方法 学习如何使用智能指针和C++一般…假设我有以下类: template<typename T> class MyClass { public: MyClass(const T& def_val) private: std::unique_ptr<T> default_val; };

C++11 初始化唯一\u ptr的正确方法 学习如何使用智能指针和C++一般…假设我有以下类: template<typename T> class MyClass { public: MyClass(const T& def_val) private: std::unique_ptr<T> default_val; };,c++11,C++11,如果我只想存储一个指向T类型对象的指针,其值在默认的_val类成员中给定,那么实现构造函数的惯用方法是什么?我的理解是,我根本不必定义析构函数,因为unique_ptr将自动清理自身?按照您编写代码的方式,MyClass只能存储指向构造函数参数副本的唯一指针: MyClass::MyClass(const T& def_val) : default_val(new T(def_val)) { } 这意味着T必须是可复制构造的 我的理解是,我根本不必定义析构函数,因为unique_ptr

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

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

MyClass::MyClass(const T& def_val)
: default_val(new T(def_val))
{
}
这意味着T必须是可复制构造的

我的理解是,我根本不必定义析构函数,因为unique_ptr将自动处理自身的清理工作


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

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

MyClass::MyClass(const T& def_val)
: default_val(new T(def_val))
{
}
这意味着T必须是可复制构造的

我的理解是,我根本不必定义析构函数,因为unique_ptr将自动处理自身的清理工作


对。这是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、生成副本或临时变量,如果您使用的是C++11,那么还可以添加一个接受右值ref的构造函数

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(生成副本)或temporaries(临时值)

您忘记在T&&constructor中分配对象。编辑以在T&&constructor中分配对象。注意:如果您使用的是C++11,那么在有关unique_ptr的问题中,这一点有点多余,因为unique_ptr也被标记为您忘记了在T&&constructor中分配对象。编辑以在T&&constructor中分配对象。注意,如果你使用的是C++11,那么在关于unique_ptr的问题上有点多余。unique_ptr也被标记为unique_ptr,它有一个指向动态分配的T的指针。。。因此,您需要动态分配一个T并将其存储在默认值中。ptr拥有一个指向动态分配T的指针。。。因此,您需要动态分配一个T并将其存储在默认值中