shared_ptr 和 unique_ptr 构造函数

时间:2021-06-12 02:41:25

标签: c++ c++11 stl smart-pointers

当我使用智能指针时,我总是需要用工厂函数来构造它,例如std::make_shared<T>std::make_unique<T>,我不使用带指针的构造函数,因为我试图避免 new 的任何用法/外观。但我的问题是为什么 C++ 标准没有包含一个将参数列表转发到类型 T 的构造函数?就像不是 shared_ptr<T> make_shared(Args&&...),我们可以有以下:

shared_ptr<T>::shared_ptr(Args&&...) {...}
unique_ptr<T>::unique_ptr(Args&&...) {...}

1 个答案:

答案 0 :(得分:1)

基本上是为了避免歧义和混淆。

歧义的产生是因为 barplot(10:1) text(x = 1:10, y = par("usr")[3] - 0.45, labels = LETTERS[1:10], xpd = NA, srt = 45, cex = 1, adj = 1) ## srt is for rotating labels 有超过 10 个构造函数重载,而 std::shared_ptr 也有六个,其中很多是模板。因此,添加一个旨在将参数转发给托管对象的方法将导致编译器无法选择其含义或无法访问托管对象的某些构造函数。

即使以某种方式避免了歧义,也可能会混淆用户。这是因为 std::unique_ptr 构造函数用于构造 shared_ptr 对象,而 shared_ptr 用于创建由 make_shared 管理的对象。

这些工厂的想法不是要摆脱代码中 shared_ptr 的出现。从 new 获取其值的 shared_ptr 管理资源的方式与从其中一个构造函数获取其值的 make_shared 不同。摆脱 shared_ptr 只是令人愉快的副产品,但我们仍然需要这些构造函数(例如用于设置删除器),因此在代码中区分它可以简化阅读。