为什么用户定义的移动构造函数会禁用隐式复制构造函数?

2023-11-21

当我阅读 boost/shared_ptr.hpp 时,我看到了这段代码:

//  generated copy constructor, destructor are fine...

#if defined( BOOST_HAS_RVALUE_REFS )

// ... except in C++0x, move disables the implicit copy

shared_ptr( shared_ptr const & r ): px( r.px ), pn( r.pn ) // never throws
{
}

#endif

注释“生成的复制构造函数、析构函数都很好,除了在 C++11 中,移动禁用隐式复制”在这里意味着什么?我们是否应该始终自己编写复制构造函数来防止 C++11 中出现这种情况?


我赞成 ildjarn 的回答,因为我发现它既准确又幽默。 :-)

我提供替代答案是因为我假设OP可能想知道问题的标题why标准是这么说的。

背景

C++ 已经隐式生成了复制成员,因为如果没有,它就会在 1985 年胎死腹中,因为它是so与 C 不兼容。如果那样的话,我们今天就不会进行这样的对话,因为 C++ 就不会存在。

话虽这么说,隐式生成的复制成员类似于“与魔鬼打交道”。没有它们,C++ 就不可能诞生。但它们是邪恶的,因为它们在大量实例中默默地生成不正确的代码。 C++ 委员会并不傻,他们知道这一点。

C++11

既然 C++ 已经诞生,并且已经发展成为一个成功的成熟体,委员会很想说:我们不再做隐式生成的复制成员了。他们太危险了。如果您想要隐式生成的复制成员,您必须选择加入该决定(而不是选择退出)。然而,考虑到如果这样做的话现有的 C++ 代码量将会被破坏,这无异于自杀。有一个huge向后兼容性的担忧是相当合理的。

因此委员会达成了妥协的立场:如果您声明移动成员(旧版 C++ 代码无法做到这一点),那么我们将假设默认的复制成员可能会做错误的事情。选择加入(与=default)如果你想要的话。或者自己写。否则它们将被隐式删除。我们迄今为止在仅移动类型的世界中的经验表明,这种默认位置实际上是非常常见的所需位置(例如unique_ptr, ofstream, future, ETC。)。选择加入的费用实际上相当小= default.

期待

The committee would love to even say: If you've written a destructor, it is likely that the implicit copy members are incorrect, so we will delete them. This is the C++98/03 "rule of three". However even that would break lots of code. However the committee has said in C++11 that if you provide a user-declared destructor, the implicit generation of copy members is deprecated.1, 2 That means that this feature could be removed in a future standard. And that any day now your compiler might start issuing "deprecated warnings" in this situation (the standard can not specify warnings).

结论

因此请预先警告:C++ 经过几十年的发展和成熟。这意味着您父亲的 C++ 可能需要迁移才能处理您孩子的 C++。这是一个缓慢、渐进的过程,这样您就不会放弃并移植到另一种语言。但它is改变,即使缓慢。


1 http://eel.is/c++draft/class.mem#class.copy.ctor-6.sentence-3

2 http://eel.is/c++draft/class.mem#class.copy.assign-2.sentence-3

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

为什么用户定义的移动构造函数会禁用隐式复制构造函数? 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 按成员序列化

    我已经实现了template
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • Stream.Dispose 是否总是调用 Stream.Close (和 Stream.Flush)

    如果我有以下情况 StreamWriter MySW null try Stream MyStream new FileStream asdf txt MySW new StreamWriter MyStream MySW Write bl
  • 如何使用 Spark 创建用于文本分类的 TF-IDF?

    我有一个格式如下的 CSV 文件 product id1 product title1 product id2 product title2 product id3 product title3 product id4 product ti
  • -fopenmp 提供什么预处理器定义?

    我有一些可以使用 或不使用 OpenMP 运行的代码 这取决于用户如何设置 makefile 如果他们想使用 OpenMP 运行 那么他们只需添加 fopenmp to CFLAGS and CXXFLAGS 我正在尝试确定可以使用什么预处
  • 统计:Python 中的组合

    我需要在 Python 中计算组合 nCr 但找不到执行此操作的函数math numpy or stat图书馆 类似以下类型的函数 comb calculate combinations n r 我需要可能的组合数量 而不是实际的组合 所以
  • 让 gprof 根据挂钟时间进行分析?

    我的理解是 默认情况下 gprof 会考虑 CPU 时间 有没有办法让它根据挂钟时间进行分析 我的程序执行大量磁盘 I O 因此它使用的 CPU 时间仅代表实际执行时间的一小部分 我需要知道磁盘 I O 的哪些部分占用最多时间 您可以使用以
  • 如何访问 R v3 中的 Windows COM 对象?

    前段时间 您曾经可以安装rcom在 R 中打包以使用 COM 脚本 例如 访问外部程序 不幸的是 它似乎已停产 包 rcom 已从 CRAN 存储库中删除 以前可用的版本可以从存档中获取 这取决于 statconnDCOM 它现在限制使用
  • C++ 中的 RESTful 客户端 API

    是否有任何可用的开源库可以在 C 中实现 RESTful Client 用于将 HTTP 请求解释为 REST 服务调用的库 我的要求是连接到 Amazon Web Services 并获取 C 中给定用户帐户可用的 EC2 实例列表 及其
  • 在Scheme中捕获宏

    使用定义捕获宏的最简单方法是什么define syntax or define syntax rule在球拍 作为一个具体的例子 这是一个简单的例子aif在 CL 风格的宏系统中 defmacro aif test if true opti
  • Chrome - 多个请求

    每当我使用 chrome 向我的 web 应用程序发送 GET 请求时 根据我的 apache 访问日志 两个相同的请求 并非总是如此 但大多数时候 我无法重现它 它不是针对 favicon 发送到服务器 尽管 chrome 开发工具中只显
  • 如何更改 ASP.NET Core 中本地开发的默认 SSL 证书?

    在 Linux 上运行本地 ASP NET Core 应用程序时 如何将自己的证书配置为 Kestrel 使用的 默认 证书 我知道我可以运行dotnet dev certs https命令生成新的开发证书 但这将生成新的自签名证书 我不想
  • distance Between() 返回的结果不准确?

    I use distanceBetween Location 类来计算两点之间的距离 如下所示 private float getDistanceInMiles GeoPoint p1 GeoPoint p2 double lat1 dou
  • 设置列名 ddply

    如何设置汇总数据的列名 library plyr ddply data col1 col2 nrow like in ddply data col1 col2 function x data frame number nrow x 也许您正
  • 如何在控件聚焦时持续显示工具提示?

    如何在控件聚焦时持续显示工具提示 我已经尝试了很多事情 但似乎没有任何效果 现在我有类似以下内容
  • Angular - 无法按工作进行 ng-repeat order

    我已经尝试了很多 ng repeat 和 orderBy 的例子 但我无法让我的 json 与它一起工作 div div div release environment id div div div 和 JSON f
  • 获取CPU/内存利用率的跨平台方法[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 寻找一个库或相当跨平台的方法来获取 C C 中的 CPU 利用率 内存利用率等 除了 getrusage 之外 我需要整个系统 而不是一个进程 我查
  • Data Studio 中的自定义查询出现无效日期错误

    我正在尝试在 Data Studio 中使用自定义查询 BigQuery 准备图表 但是 在使用 Data Studio 日期参数时出现无效日期错误 DS START DATE and DS END DATE 这是我的查询 SELECT c
  • 访问共享网络文件夹

    我需要通过 VBA 访问网络文件服务器上托管的文件夹 该文件夹只能通过我有用户名和密码的服务帐户 与普通用户帐户不同 以书面形式访问 通过 UI 我可以看到该文件夹 并将其映射为本地驱动器 但为了以书面形式访问它 我需要从 Windows
  • “错误:选项 --single-version-externally-management 无法识别”表示什么?

    我似乎突然开始遇到错误error option single version externally managed not recognized使用时pip install与各种包 包括PyObjC and astropy 我以前从未见过这
  • ZLib Inflate() 失败并显示 -3 Z_DATA_ERROR

    我试图通过调用 inflate 函数来解压缩文件 但即使我使用网站上的示例程序 它也总是失败并出现 Z DATA ERROR 我想也许我的 zip 文件不受支持 我在下面附上了 zip 标题的图片 这是我编写的用于执行解压缩的函数 我一次读
  • 为什么用户定义的移动构造函数会禁用隐式复制构造函数?

    当我阅读 boost shared ptr hpp 时 我看到了这段代码 generated copy constructor destructor are fine if defined BOOST HAS RVALUE REFS exc