保证复制省略的行为是否取决于用户定义的复制构造函数的存在?

2023-11-23

无论有或没有用户定义的复制构造函数,以下代码的行为都不同在 GCC 8.0.1 下:

#include <cassert>

struct S {
    int i;
    int *p;
    S() : i(0), p(&i) {}
    // S(const S &s) : i(s.i), p(&i) {}  // #1
    // S(const S &s) : i(s.i), p(s.p) {} // #2
    // S(const S &s) = delete;           // #3
};

S make_S() {return S{};}

int main()
{
    S s = make_S();
    assert(s.p == &s.i);
}

使用任一带注释的用户定义复制构造函数(即使使用 #2,即执行简单浅复制的构造函数),断言都不会失败,这意味着保证复制省略按预期工作。

但是,如果没有任何用户定义的复制构造函数,断言就会失败,这意味着对象s in main函数不是默认构造的。为什么会出现这种情况?这里不保证复制省略执行吗?


引用自 C++17 工作草案 §15.2 临时对象第 3 段(https://timsong-cpp.github.io/cppwp/class.temporary#3):

当类类型 X 的对象传递给或从函数返回,如果 X 的每个复制构造函数、移动构造函数和析构函数都是平凡的或已删除的,并且 X 至少有一个未删除的复制或移动构造函数,允许实现创建一个临时对象来保存函数参数或结果对象。 ... [Note:授予此自由度是为了允许将类类型的对象传递到寄存器中的函数或从寄存器中的函数返回。 —end note]

在您的情况下,当我将复制和移动构造函数设置为默认值时:

S(const S &) = default;
S(S &&) = default;

GCC 和 Clang 的断言也失败。请注意,隐式定义的构造函数很简单。

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

保证复制省略的行为是否取决于用户定义的复制构造函数的存在? 的相关文章

  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • 线程安全的get(访问器方法)

    我目前正在使用以下代码对变量进行线程安全访问 int gnVariable void getVariableValue int pnValue acquireLock Acquires the protection mechanism pn
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • Reflection.Emit 中的短格式操作码错误

    我正在制作一种与以下非常相似的小语言hlsl但仅支持像素着色器 该语言使用reflection emit构建实现相同功能的 NET 程序集 我目前正在测试分支指令的实现if在我的一个单元测试中 一个大的if与内if elses 失败并显示以
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo
  • 使用 C 创建立体声正弦波

    我正在尝试用 C 创建立体声正弦 WAV 并且可能有不同的 可能是空白的 左声道和右声道 使用此函数为每个通道生成一个音调 int16 t create tone float frequency float amplitude float
  • 是否可以用 C# 为 Android 编写应用程序?

    我们都知道Android运行Dalvik VM程序 通常开发人员用 Java 编写程序并将其编译为 Dalvik 字节码 我想知道是否有可能创建一个可以接受 C 代码并将其编译为 Dalvik 字节码的编译器 嗯 这是一种选择 或者您可以在
  • popen2()在c中如何工作?

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • 未定义条件编译符号

    我无法让 Visual Studio 按照我的预期运行 我创建了 2 个配置文件 一个定义了符号 FOO 另一个定义了符号 BAR 我有这个代码 static class MyClass if FOO public static strin
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • 在同一条线上铸造两次

    我在项目中看到了这段代码 b的类型是void void b int a int unsigned long b 这条线毫无意义吗 我的意思是 这与a int b在所有情况下 这可能会避免 64 位 Unix 系统上的编译器警告unsigne
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 组合框由于某种原因被链接

    我有以下代码来填充 3 个组合框 private void PopulateDDLs SqlConnection connection SqlCommand command SqlDataReader reader DataTable dt

随机推荐

  • 在 Visual Studio 2010 中查找类后代

    我正在 Visual Studio 2010 的对象浏览器中查看一个抽象类 我想找到从这个抽象类派生的所有类 这样我就可以选择最好的一个来在我的应用程序中实现 我没有该程序集的源代码 因此无法使用在文件中查找功能 不幸的是 我似乎根本不知道
  • 基于另一个列表的 1 个列表的流过滤器

    我在这个论坛和谷歌搜索后发布我的查询 但无法解决相同的问题 例如 Link1 Link2 Link3 我正在尝试根据列表 1 中的值过滤列表 2 多列 List1 Datsun Volvo BMW Mercedes List2 1 Jun
  • 将通用过程作为实际参数传递给函数

    我试图将通用过程作为实际参数传递给函数 module mymod implicit none interface func module procedure func1 module procedure func2 endinterface
  • Ionic 2:使用 Cordova 插件

    我做了很多谷歌搜索 但似乎无法找到太多答案 在 Ionic 2 中调用 Cordova 插件的语法是如何工作的 例如 在 Ionic 1 中 我正在使用 Facebook 插件 我会这样称呼它 cordovaFacebook login p
  • 按字母顺序对选择菜单进行排序?

    我有以下选择菜单 jsFiddle
  • Hive解释计划理解

    是否有任何适当的资源可以让我们完全理解 hive 生成 的解释计划 我尝试在 wiki 中搜索它 但找不到完整的指南来理解它 这是 wiki 它简要解释了解释计划的工作原理 但我需要有关如何推断解释计划的更多信息 https cwiki a
  • 如何将日期作为 URL 参数传递

    我正在使用钛通过网络服务为特定的网络应用程序创建一些应用程序 这里我将日期作为 URL 参数传递来调用 java 中的特定 webservice 方法 日期格式如下 2015 02 04T05 10 58 05 30 在java服务方法中
  • PHP从具有关系数据的数组创建多维数组[重复]

    这个问题在这里已经有答案了 可能的重复 根据父 ID 值将数组从一维转换为多维 我正在 PHP 工作 我有以下包含关系数据 父子关系 的数组 Array 5273 gt Array id gt 5273 name gt John Doe p
  • 如何像在浏览器中一样在vscode中打开HTML文件?

    vscode 或任何扩展更新完成后 vscode 中将显示发行说明 我可以在我的电脑中找到releasenote 它是HTML文件 我通过vscode打开它 vscode显示HTML代码 不喜欢通过浏览器打开 一般来说 我想在vscode而
  • OpenGL 顶点缓冲区绑定点可以在不同的 VAO 之间重用吗?

    假设我使用新的 从 OpenGL 4 3 开始 glBindVertexBuffer 机制设置了两个 VAO glGenVertexArrays 1 vaoIndex0 glGenVertexArrays 1 vaoIndex1 glBin
  • 如何在 PHP 中获取浮点数的二进制表示?

    有没有办法在 PHP 中获取浮点数的二进制表示形式 类似于 Java 的东西Double doubleToRawLongBits 给定一个正浮点数 我想获得小于该数字的最大可表示浮点数 在Java中 我可以这样做 double x Doub
  • 我应该如何将文件加载到我的 Java 应用程序中?

    我应该如何将文件加载到我的 Java 应用程序中 简短的回答 使用以下两种方法之一 Class getResource String Class getResourceAsStream String 例如 InputStream input
  • 在 Snap.svg 图形上设置 ID 属性

    我在用着Snap svgAPI 和我需要在 CSS 中选择三个图形以用于样式设计 因此 为了区分它们 我需要给它们一个 ID 或类名 这就是我创建元素的方式 var draw Snap 100 75 c draw polyline 0 0
  • Java Nio绝对路径到相对路径

    我有一个指向磁盘上文件的路径 例如 C folder dir dir2 file txt 在代码中 如果在使用该文件时抛出异常 它将输出整个路径 理想情况下 最好不要打印整个目录 而是像这样 dir2 file txt 看来我应该能够做到这
  • 如何监控ActiveMQ Artemis

    我正在 Windows NET 环境中使用 RabbitMQ ActiveMQ Classic 和 ActiveMQ Artemis 进行一些测试 RabbitMQ 和 ActiveMQ 经典 附带一个 Web 界面 您可以在其中查看有关代
  • 除 na.rm= TRUE 外,mean 还返回 NaN

    样本数据 date coins 2013 10 01 NA 2013 10 01 NA 2013 10 01 NA 2013 11 01 10 2013 11 01 NA 2013 11 01 20 2013 11 01 30 2013 1
  • jQuery UI 使用 .droppable 放入 div 时删除元素

    我正在尝试找出如何做到这一点的逻辑 我有很多只有 CSS 类名的图像 它们是动态创建的 这些图像可以使用 jQuery UI 进行拖动 draggable 我需要一个 垃圾桶 当将元素拖入 时 它会被删除 Example http jsfi
  • 如何在 AngularJS 中设置动态模型名称?

    我想用一些动态问题填充表单 小提琴here div ul li div question Text div li ul div
  • CodeIgniter 中的联接查询[重复]

    这个问题在这里已经有答案了 我在 CodeIgniter 中使用联接查询 但无法使其工作 它只显示一个表数据 而不显示另一表数据 我是 CodeIgniter 的新手 无法弄清楚这一点 请有人帮助我 提前Tnanks view br br
  • 保证复制省略的行为是否取决于用户定义的复制构造函数的存在?

    无论有或没有用户定义的复制构造函数 以下代码的行为都不同在 GCC 8 0 1 下 include