shared_ptr 和 unique_ptr 构造函数

泛光灯

当我使用智能指针时,我总是需要使用工厂函数来构造它,例如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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

unique_ptr和shared_ptr的重载方法与多态性模棱两可

C ++ 11 unique_ptr和shared_ptr是否能够转换为彼此的类型?

unique_ptr和shared_ptr之间的区别

模板别名shared_ptr和unique_ptr时是否有陷阱或限制?

std :: unique_ptr和std :: shared_ptr之间的破坏行为差异的原理是什么?

C ++ 11 unique_ptr数组和构造函数参数

shared_ptr与unique_ptr在类和子类中的使用

为什么std :: unique_ptr没有像std :: shared_ptr这样的别名构造函数?

shared_ptr和unique_ptr转换

构造函数依赖注入:unique_ptr + move vs shared_ptr

与std :: shared_ptr和std :: unique_ptr相比,std :: optional`有什么优势?

移动unique_ptr的构造函数和向量

具有unique_ptr和线程的默认矢量构造函数

std :: unique_ptr和std :: shared_ptr作为虚拟函数的参数

std :: unique_ptr析构函数构造函数顺序

OpenMP和shared_ptr

在C ++中将unique_ptr和shared_ptr与函数参数一起使用

std :: unique_ptr构造函数的行为

为什么unique_ptr和shared_ptr不会使它们的构造指针无效?

是否要从unique_ptr构造shared_ptr?

删除函数unique_ptr

std :: unique_ptr,默认副本构造函数和抽象类

如何取得std :: unique_ptr和std :: shared_ptr的所有权

使用unique_ptr <>实现移动构造函数和赋值

不可复制的对象,映射和shared_ptr:复制构造函数中的错误

std :: unique_ptr constexpr构造函数

使用 shared_ptr 而不是 unique_ptr 作为类成员只是为了避免隐式复制构造函数删除是否明智?

结合 std::unique_ptr 和命名构造函数

shared_ptr 和 unique_ptr 的不完整类型