C++0x 中的特殊成员函数

2024-02-26

维基百科文章关于特殊成员函数 http://en.wikipedia.org/wiki/Special_member_functions不包含任何对移动构造函数和移动赋值运算符的引用。

我想更新该条目,但我不确定 0x 标准的内容。

这两个函数的规则是什么?它们是由编译器自动生成的吗?如果是的话,什么时候生成?


Edit:我已经更新了维基百科页面,如果有人愿意,请通过编辑它来帮助社区(如果需要)。


请记住,C++0x 还不是很标准,这可能会发生变化。来自FCD http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf(PDF链接),移动构造函数和移动赋值运算符确实可以显式默认,甚至隐式默认。*****


我只是要引用(大量删节)一些可能有用的内容:

关于显式默认函数,第 8.4.2/1-2 节:

明确默认的函数应

  • 是一个特殊的成员函数,
  • 具有与隐式声明相同的声明函数类型,
  • 没有默认参数,并且
  • 没有例外规范。

如果在第一个声明中明确默认它,

  • 它将是公开的,
  • 不得明确,
  • 它不应是虚拟的,
  • 它被隐式地认为具有与隐式声明相同的异常规范(15.4),并且
  • 对于复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符,它应具有与隐式声明相同的参数类型。

关于特殊成员函数,§12/1:

默认构造函数 (12.1)、复制构造函数和复制赋值运算符 (12.8)、移动构造函数和移动赋值运算符 (12.8) 以及析构函数 (12.4) 是特殊成员函数。 [ 注意:当程序未显式声明某些类类型时,实现将隐式声明这些成员函数。如果使用它们,实现将隐式定义它们。见12.1、12.4 和12.8。 ——尾注]

关于隐式声明的函数,第 12.8/8-11 节:

如果类定义没有显式声明复制构造函数并且没有用户声明的移动构造函数,则复制构造函数将隐式声明为默认值 (8.4)。

类 X 的隐式声明的复制构造函数将具有以下形式X::X(const X&) if

  • X 的每个直接或虚拟基类 B 都有一个复制构造函数,其第一个参数的类型为const B& or const volatile B&, and
  • 对于 X 中属于类类型 M(或其数组)的所有非静态数据成员,每个此类类类型都有一个复制构造函数,其第一个参数的类型为const M& or const volatile M&.

否则,隐式声明的复制构造函数将具有以下形式X::X(X&).

如果类定义没有显式声明移动构造函数,则当且仅当

  • X 没有用户声明的复制构造函数并且
  • 移动构造函数不会被隐式定义为已删除。

[ 注意:当未隐式声明或显式提供移动构造函数时,本来会调用移动构造函数的表达式可能会调用复制构造函数。 ——尾注]

类 X 的隐式声明的移动构造函数将具有以下形式X::X(X&&).

关于隐式删除的默认函数,第 12.8/12 节:

隐式声明的复制/移动构造函数是其类的内联公共成员。如果 X 具有以下条件,则类 X 的默认复制/移动构造函数被定义为已删除 (8.4.3):

  • 具有非平凡对应构造函数的变体成员,并且 X 是类似联合的类,
  • 类类型 M(或其数组)的非静态数据成员,无法复制/移动,因为应用于 M 相应构造函数的重载决策 (13.3) 会导致歧义或从默认值中删除或无法访问的函数构造函数,或者
  • 无法复制/移动的直接或虚拟基类 B,因为重载解析(13.3)应用于 B 的相应构造函数会导致歧义或从默认构造函数中删除或无法访问函数,或者
  • 对于移动构造函数,是一个非静态数据成员或者直接或虚拟基类,其类型不具有移动构造函数并且不可简单复制。

§12.8/13-18 定义了函数在隐式生成时应如何工作。

然后,§12.8/19 执行与 §12.8/8 相同的操作,但复制赋值和移动赋值运算符除外。它们非常相似,无需在此引用。

为了获得更完整的了解,您需要完整阅读这些部分,但这就是总体思路。我很高兴我们获得了隐式移动语义。


*但是就像默认的复制功能一样,它们可能并不总是具有正确的行为!三巨头应该成为五巨头。 (例如,每当我们需要深度复制某些内容时,就会实现“三巨头”。我们还需要确保进行“深度移动”,其中源数据被清空/重置。这是not隐式完成。)

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

C++0x 中的特殊成员函数 的相关文章

随机推荐

  • 不能使用公共嵌套类作为私有方法参数

    在下面的代码中 class Outer private void f private Outer Inner in Wrong public class Inner void f public Outer Inner in OK f pri
  • 如何保证 OAuth 消费者秘密的安全,以及当其泄露时如何反应?

    这个问题是关于尝试了解在 Android 等移动平台上实现 oauth 所涉及的安全风险 这里假设我们有一个 Android 应用程序 其代码中嵌入了消费者密钥 秘密 假设消费者的秘密被泄露 并且黑客已经掌握了它 那么会产生什么后果 消费者
  • Debian平台上如何使用pm2启动命令?

    以下是 GitHub 上文档的链接 https github com Unitech pm2 startup script Generation pm2 startup https github com Unitech pm2 startu
  • 当变量为 Null 时 Laravel 5.3 验证失败

    自从 Laravel 从 5 1 升级到 5 3 以来 我在验证方面遇到了一些奇怪的问题 当我发布这样的数据时 firstName null 验证规则是这样的 validator Validator make postData firstN
  • 在 Flask 中迭代提交的表单字段?

    在 Flask 0 8 中 我知道我可以使用以下方式访问各个表单字段form fieldname data 但是有没有一种简单的方法来迭代所有表单字段 我正在构建一个电子邮件正文 我想循环所有字段并为每个字段创建一个字段名称 值条目 而不是
  • 需要在 C 中将 2 的补码转换为十进制的最快方法

    我有 32 位内的某个 18 位 2 的补码 我需要将它们转换为十进制 请给我看一段 C 代码片段 首先你需要做符号扩展 http en wikipedia org wiki Sign extension在你的18位上 填写本机int co
  • svn:数据库已锁定,正在执行语句“RELEASE s0”

    在尝试从私有分支进行合并时 我不断收到列出的错误 数据库被锁定 正在执行语句 RELEASE s0 我运行 collabnet subversion 边缘服务器 1 7 5 3220 94 我运行tortoise svn客户端 Tortoi
  • 创建如果两个表中的行匹配条件则返回 id 的查询

    我正在学习 SQL dbms 并使用 Postgres 我想返回在特定列中都具有特定值的行 例如在表格中Carpets and Curtains 我想得到ids 行 其中颜色为 light yellow 我想我需要加入 但不确定是什么类型
  • 如何在 OpenLayers 5.3.0 中剪切和显示剪切的向量几何

    我必须根据主 限制向量层来剪辑向量层 绘制时 如果绘制图层的某些部分在限制图层之外 则剪掉限制图层之外的区域 示例 1 正如我们所看到的 底部边框的一部分处于限制之外 紫色层 我想知道是否可以向限制层外部的剪辑区域添加功能 示例 2 删除限
  • C 标准数据结构库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 语言 Windows 平台 中经过测试和测试的标准库 它实现了堆栈 队列 树等数据结构
  • 错误:“函数”对象不可下标

    我正在做我的 python 作业 但是当我想测试上面的情况时出现错误 这是我的代码 def evalTerm env t if type t Node for label in t children t label if label Num
  • 安全共享的 Google 日历

    我正在开发一个小型网站 它有一个非常简单的想法 有两组用户 办公室和工人 都必须登录才能访问该网站 该网站是使用Zend框架构建的 问题 我想要一个所有用户都可以访问的日历 办公室工作人员能够编辑日历 而工作人员只能查看日历 我真的很想使用
  • 如何利用MVC中的常用图像资源

    我有几个 ASP NET MVC3 和 4 网站 所有站点都使用独立于库的相同资源 资源是 resx 文件 我想在这些网站内的 html 中使用这些资源中的图像 我之前没有使用过 resx 文件 所以不确定使用它们的好方法是什么 我认为我可
  • 将新节点添加到力导向布局

    关于 Stack Overflow 的第一个问题 请耐心等待 我是 d3 js 的新手 但一直对其他人能够用它完成的事情感到惊讶 并且几乎同样对我自己用它取得的进展如此之少感到惊讶 显然我没有摸到什么 所以我希望这里善良的灵魂可以向我展示光
  • 使用ajax通过单击按钮运行php脚本

    我是一个业余爱好者 对 html javascript php 的了解有限 我设置了一台 Raspberry Pi 微型计算机作为 Web 服务器 首先 我想通过网页上的按钮打开连接到 Pi 的 LED 我有以下有效代码 html 文件的名
  • 手动设置Flutter验证错误

    验证表单并将请求从 flutter 发送到服务器后端后 我想将服务器中的任何潜在错误消息设置为以原始表单显示 最好与验证错误完全相同 例如 Widget build BuildContext context TextFormField on
  • 指针访问和引用访问哪个更快?

    在下面的示例代码中 我分配了 struct Chunk 的一些实例 然后 在 for 循环中 我迭代内存块并使用指针或引用访问不同的实例 并为它们分配一些随机数据 但是哪个 for 循环执行得最快呢 据我所知 我认为引用循环将是最快的 因为
  • 清理 URL 以防止 Rails 中的 XSS

    在 Rails 应用程序中 用户可以创建事件并发布 URL 以链接到外部事件站点 如何清理网址以防止 XSS 链接 提前致谢 XSS 示例 rails 的清理方法无法预防该问题 url javascript alert XSS a href
  • .Net core & SynchronizationContext & Thread.SetData

    据我所知 AspNetCore没有 https blog stephencleary com 2017 03 aspnetcore synchronization context html SynchronizationContext 重新
  • C++0x 中的特殊成员函数

    维基百科文章关于特殊成员函数 http en wikipedia org wiki Special member functions不包含任何对移动构造函数和移动赋值运算符的引用 我想更新该条目 但我不确定 0x 标准的内容 这两个函数的规