shared_ptr 和 unique_ptr 构造函数
shared_ptr and unique_ptr constructor
当我使用智能指针时,我总是需要用工厂函数来构造它,例如std::make_shared<T>
和 std::make_unique<T>
,我不使用带指针的构造函数,因为我尽量避免 new
的任何 usage/appearances。但我的问题是,为什么 C++ 标准不包含一个将参数列表转发给类型 T
的构造函数?就像 shared_ptr<T> make_shared(Args&&...)
一样,我们可以有以下内容:
shared_ptr<T>::shared_ptr(Args&&...) {...}
unique_ptr<T>::unique_ptr(Args&&...) {...}
基本上是为了避免歧义和混淆。
出现歧义是因为 std::shared_ptr
有超过 10 个构造函数重载,而 std::unique_ptr
也有六个,其中很多是模板。因此,添加一个旨在将参数转发给托管对象的参数将导致编译器无法选择其含义或无法访问托管对象的某些构造函数。
即使以某种方式避免了歧义,也有可能使用户感到困惑。这是因为 shared_ptr
构造函数用于构造 shared_ptr
对象,而 make_shared
用于使对象由 shared_ptr
.
管理
这些工厂的想法并不是要在代码中消除 new
的出现。从 make_shared
获取其值的 shared_ptr
与从其中一个构造函数获取其值的 shared_ptr
管理资源的方式不同。摆脱 new
只是令人愉快的副产品,但我们仍然需要那些构造函数(例如用于设置删除器),因此在代码中区分它可以简化阅读。
当我使用智能指针时,我总是需要用工厂函数来构造它,例如std::make_shared<T>
和 std::make_unique<T>
,我不使用带指针的构造函数,因为我尽量避免 new
的任何 usage/appearances。但我的问题是,为什么 C++ 标准不包含一个将参数列表转发给类型 T
的构造函数?就像 shared_ptr<T> make_shared(Args&&...)
一样,我们可以有以下内容:
shared_ptr<T>::shared_ptr(Args&&...) {...}
unique_ptr<T>::unique_ptr(Args&&...) {...}
基本上是为了避免歧义和混淆。
出现歧义是因为 std::shared_ptr
有超过 10 个构造函数重载,而 std::unique_ptr
也有六个,其中很多是模板。因此,添加一个旨在将参数转发给托管对象的参数将导致编译器无法选择其含义或无法访问托管对象的某些构造函数。
即使以某种方式避免了歧义,也有可能使用户感到困惑。这是因为 shared_ptr
构造函数用于构造 shared_ptr
对象,而 make_shared
用于使对象由 shared_ptr
.
这些工厂的想法并不是要在代码中消除 new
的出现。从 make_shared
获取其值的 shared_ptr
与从其中一个构造函数获取其值的 shared_ptr
管理资源的方式不同。摆脱 new
只是令人愉快的副产品,但我们仍然需要那些构造函数(例如用于设置删除器),因此在代码中区分它可以简化阅读。