问题描述
当我使用智能指针时,我总是需要用工厂函数来构造它,例如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&&...) {...}
解决方法
基本上是为了避免歧义和混淆。
歧义的产生是因为 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
只是令人愉快的副产品,但我们仍然需要这些构造函数(例如用于设置删除器),因此在代码中区分它可以简化阅读。