为什么shared_ptr删除器必须是可复制构造的?

2024-04-28

在 C++11 中std::shared_ptr有四个构造函数,可以传递删除器对象d类型的D。这些构造函数的签名如下:

template<class Y, class D> shared_ptr(Y * p, D d);
template<class Y, class D, class A> shared_ptr(Y * p, D d, A a);
template <class D> shared_ptr(nullptr_t p, D d);
template <class D, class A> shared_ptr(nullptr_t p, D d, A a);

该标准要求在[util.smartptr.shared.const] http://eel.is/c++draft/util.smartptr.shared.const#7 type D可复制构造。为什么需要这个?如果shared_ptr复印d那么这些删除器中的哪一个可能会被调用呢?难道不可能吗shared_ptr只保留一个删除器?这对一个人来说意味着什么shared_ptr to own删除器如果d可以复制吗?

CopyConstructible 要求背后的基本原理是什么?

PS:这个要求可能会使编写删除器变得复杂shared_ptr. unique_ptr似乎对其删除器有更好的要求。


这个问题太令人困惑了,我给彼得·迪莫夫(Peter Dimov)(boost::shared_ptr并参与标准化std::shared_ptr)

以下是他所说的要点(经他许可转载):

我的猜测是,Deleter 必须是可复制构造的,实际上只是作为一个 C++03 的遗物,其中不存在移动语义。

你的猜测是正确的。什么时候shared_ptr被指定为右值引用 还不存在。如今我们应该能够满足要求 不可抛出移动构造。

有一个微妙之处,当

pi_ = new sp_counted_impl_pd<P, D>(p, d);

throws, d必须保持完整以进行清理d(p)去工作,但是我 认为这不会是一个问题(虽然我实际上还没有 试图使实施移动友好)。
[...]
我认为对于 实现来定义它,以便当new投掷,d将被留下 处于原始状态。

如果我们更进一步并允许D要有一个投掷移动构造函数,事情就得到了 更复杂。但我们不会。 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么shared_ptr删除器必须是可复制构造的? 的相关文章

随机推荐

  • MATLAB:解包函数

    我正在与 Mathworks 的某人讨论 unwrap http www mathworks com access helpdesk help techdoc ref unwrap html函数中对于 以外的跳跃容差有一个 bug 并且希望
  • 如何取消 Vim 中的粘贴操作?

    每当我不小心在 Putty 中右键单击 打开 Vim 时 我的剪贴板上就有相当多的文本 并且 Vim 启动了粘贴操作 该操作已经持续了大约十分钟 我不想丢失未保存的工作 有没有办法指示 Vim 停止粘贴文本 If you re in nor
  • LDAP中超时的实现

    我一直在处理我们正在使用的应用程序LDAP获取用户详细信息 有时获取用户详细信息需要更多时间 我想实施time out获取详细信息的方法 以便我们可以避免在最坏的情况下在服务器中挂起事务 这里我们使用的是LdapUtil我们在其中配置的类L
  • 应用程序在 iPhone 上运行时崩溃,违规为例外

    Thread 1 Crashed 0 libsystem kernel dylib 0x1e81a458 abort with payload 24 1 libsystem kernel dylib 0x1e817dd9 system se
  • 在 PHP 中用星号 (*) 提示或部分隐藏电子邮件地址

    我有这个邮件地址 email protected cdn cgi l email protection 如何将其转换为该邮件地址a email protected cdn cgi l email protection 我尝试使用strpos
  • Spring数据异常处理

    我正在使用 Spring Data JPA 开发一个项目 我需要处理 JpaRepository 方法调用中的一些异常 在下面的代码中 我需要拦截主键违规错误 但无法直接捕获异常 就我而言 当发生此类异常时 存储库层 JpaReposito
  • com.android.builder.packaging.DuplicateFileException:在 APK META-INF/maven/com.fasterxml.jackson.core/jackson-databind/pom.xml 中复

    我正在创建一个使用 Rest API 来获取数据的应用程序 对于该操作 我使用 Retrofit2 okhttp3 和 jackson 将 json 解析为对象 我的应用程序还使用 Firebase Cloud Messaging 当我编译
  • 规划 git 迁移的存储库布局

    我目前有一个大型 30K 提交 SVN 存储库 正在将其转换为 git 我们的代码库当前拥有一组通用 核心 代码 以及两个独立的基础 Java 和 NET 这使我们能够共享通用代码 并且当我们将构建推送给仅支持两种语言之一的客户时 我们可以
  • 通过站点到站点 VPN 将 Azure 网站连接到本地数据库

    我的目标是运行一个天蓝色的网站 该网站可以访问我们本地公司数据库中的数据 我按照网络上的教程设置了一个 Azure 虚拟网络 并通过站点到站点 VPN 将其连接到我们本地公司网络 在天蓝色门户中 我可以看到连接实际上正在工作 并且数据已被接
  • 如何限制打字稿中的枚举字符串值

    我有具有可能的行动价值的类型 type PersistentAction park retry skip stop 然后我想用动作定义枚举 enum persistentActions PARK park RETRY retry SKIP
  • 在我自己的文件夹结构中的 Sequelize 中的迁移

    我是新来的Sequelize我当前的项目要求我将它与迁移一起使用 我熟悉迁移的内容和方式 我来自Django背景 每个子应用程序在同一文件夹中都有模态 视图 api url 和迁移 我喜欢这个结构 并希望在我的 Nodejs 应用程序中保持
  • 将 Azure Blob 与 Azure 网站连接

    我正在尝试将 Azure 网站连接到 Azure blob 我打算在容器中托管一些文件 然后从我的网站获取它们 我从本教程开始 http azure microsoft com en us documentation articles we
  • 自定义列表视图的选择器“更改 ListView 背景 - 奇怪的行为”

    我正在用这个教程 http www androidpeople com android custom listview tutorial example part 2 我想为此列表视图添加选择器 我尝试了一些代码 但它不起作用 我该怎么做
  • Python相对导入导致语法错误:无效语法

    我正在尝试安装这个很棒的 python 模块Python Chrono http oss codepoet no python chrono wiki Home我的 python 环境 但至少在 python 2 4 3 和 2 6 6 中
  • 单词和表情符号计数器

    我有一个包含 clear message 列的数据框 并且创建了一个用于计算每行中所有单词的列 history word count history clear message apply lambda x Counter x split
  • 调试神秘的git+ssh+proxy失败“bash:没有这样的文件或目录”的艰难方法

    我正在尝试通过 SOCKS5 代理克隆 github 存储库 在 ssh config I have Host github com github com ProxyCommand usr bin nc X 5 x 127 0 0 1 70
  • excel函数查找列中的最后一个数字

    我每天将股票的价值记录在列中 这是一个很长的电子表格 在每列的顶部单元格中 我想使用一个函数来自动显示该列中的最后一个条目 我尝试过 Index 函数以及 Index 函数与 Counta 函数结合使用 但没有成功 有什么建议么 尝试使用L
  • ng-clip 复制到剪贴板不起作用

    我正在使用一些教程来实现 ng clip 我正在按照教程中的方式进行操作 但它不起作用 我包括 Zeroclipboard min js angular js ngClip js html 看起来像 div div
  • vuetify v-text-field 给定值后背景颜色发生变化

    我正在使用 vuetify 创建登录表单 并使用 v text field 作为输入 当有字段建议时就会出现问题 例如 我的浏览器中保存了多封电子邮件 它会在电子邮件字段上为我提供这些电子邮件的建议 到目前为止一切都很好 但是当我选择其中之
  • 为什么shared_ptr删除器必须是可复制构造的?

    在 C 11 中std shared ptr有四个构造函数 可以传递删除器对象d类型的D 这些构造函数的签名如下 template