当我使用智能指针时,我总是需要使用工厂函数来构造它,例如std::make_shared<T>
and 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&&...) {...}
基本上是为了避免歧义和混淆。
出现歧义是因为std::shared_ptr
有超过 10 个构造函数重载,std::unique_ptr
并且还有六个,其中很多是模板。因此,添加一个旨在将参数转发给托管对象的方法将导致编译器无法选择其含义或无法访问托管对象的某些构造函数。
即使以某种方式避免了歧义,也有可能使用户感到困惑。这是因为shared_ptr
构造函数用于构造shared_ptr
对象,而make_shared
用于创建由shared_ptr
.
这些工厂的想法不是摆脱new
代码中的外观。从shared_ptr
其中获得价值的make_shared
管理资源的方式与shared_ptr
从其中一个构造函数获得价值的方式不同。摆脱new
只是令人愉快的副产品,但我们仍然需要这些构造函数(例如用于设置删除器),因此在代码中区分它可以简化阅读。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句