复制构造函数省略? [复制]

2024-03-15

可能的重复:
为什么析构函数只被调用一次? https://stackoverflow.com/questions/6422114/why-has-the-destructor-been-called-only-once

鉴于下面的代码,我无法理解 gcc 中的输出。我期望创建和销毁两个对象,但只看到对构造函数和析构函数的一次调用。这里发生了什么事?

#include <string>
#include <iostream>

struct Huge{
        Huge() { std::cout << "Constructor" << std::endl; }
        Huge(Huge const &r) { std::cout << "Copy Constructor" << std::endl; }
        ~Huge() { std::cout << "Destructor" << std::endl; }
};

Huge g() {
        std::cout << "Entering g" << std::endl;
        Huge temp;
        std::cout << "Exiting g" << std::endl;
        return temp;
}

int main(){
        Huge h2(g());
        std::cout << "Before leaving main" << std::endl;
}

该代码在 g++ (4.4) 中的输出是

输入g

构造函数

退出 g

离开主线之前

析构函数


是的,这是复制省略命名返回值优化 http://en.wikipedia.org/wiki/Return_value_optimization.

C++ 标准允许实现省略由 return 语句产生的复制操作,即使复制构造函数有副作用。

参考:

C++03 标准:
12.8 复制类对象:

# 15

当满足某些条件时,允许实现省略类对象的复制构造,即使该对象的复制构造函数和/或析构函数有副作用。在这种情况下,实现将省略的复制操作的源和目标视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象没有被销毁的较晚时间。优化.111) 复制操作的这种省略是允许的 以下情况(可以组合消除多份):

— 在具有类返回类型的函数中的 return 语句中,当表达式是与函数返回类型具有相同 cv-unqualified 类型的非易失性自动对象的名称时,可以通过构造自动对象来省略复制操作对象直接进入函数的返回值

— 当未绑定到引用 (12.2) 的临时类对象被复制到具有相同 cv-unqualified 类型的类对象时,可以通过将临时对象直接构造到被省略的目标中来省略复制操作复制

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

复制构造函数省略? [复制] 的相关文章

  • 从 C# 调用非托管 dll。拿2

    我编写了一个 C 程序 它调用一个 C DLL 将命令行参数回显到文件中 当使用 rundll32 命令调用 c 时 它显示命令行参数没有问题 但是当从 c 内部调用它时 它不会显示 我问了这个问题 https stackoverflow
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • 是否可以用 C# 为 Android 编写应用程序?

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

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中加密并在 Flex 中解密

    我需要解密 Flex 中的一些数据 这些数据是用 C 加密并写入文件的 为了简单起见 我选择使用 as3crypto As3 库和 Bruce Schneier C 库 AS3 as3加密链接 http code google com p
  • 如何在 Xamarin.Mac 中执行终端命令并读入其输出

    我们正在编写一个 Xamarin Mac 应用程序 我们需要执行像 uptime 这样的命令 并将其输出读取到应用程序中进行解析 这可以做到吗 在 Swift 和 Objective C 中都有 NTask 但我似乎无法在 C 中找到任何示
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • 如果未返回,则在一段时间后终止线程

    我有一个线程从网络或串行端口获取一些数据 如果 5 秒内没有收到数据 则线程必须终止 或返回 false 换句话说 如果线程运行时间超过 5 秒 则必须停止 我用 C 编写 但任何 NET 语言都可以 有两种方法 1 封装超时 从网络或串行
  • 使用 wmi 获取活动会话(Win32_LogonSession 还返回非活动/旧会话)

    有没有办法只显示 wmi 的活动会话 问题是 Win32 LogonSession 还显示不活动 断开连接的会话 ManagementScope scope new ManagementScope ManagementPath Defaul
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足

随机推荐

  • 通过 SSH 隧道连接到 jdbc 中的 Oracle 数据库

    目前我们必须通过 SSH 隧道来访问我们的 Oracle 数据库 为了做到这一点 我们必须确保在将应用程序部署到 Tomcat Glassfish 等之前 在服务器上运行 putty 或等效的程序 脚本来进行此调整 有没有人找到一种方法让j
  • 我可以在 django admin 中设置 list_filter 只显示引用的外键吗?

    我有一个 Django 应用程序 它有两个这样的模型 class MyModel models Model name models CharField country models ForeignKey Country class Coun
  • Linq 基于两列进行区分

    我有一个要求 我需要在两列中获取具有相同组合的唯一记录 我的数据将类似于 CA A 列 和 CB B 列 以及一些数据 CA CB 1 2 1 2 3 4 5 6 2 1 1 6 1 6 5 1 比方说 我需要获取有价值的记录1两列中的内容
  • 使用带有值列表的列来指定从哪些列创建另一个值列表

    我有数据如下 以前的解决方案 library dplyr dat in lt structure list rn c Type A Type B 0 25 c 5L 0L 25 50 c 0L 0L 25 100 c 38L 3L 50 1
  • Node 未找到 html 中包含的 js 文件

    我正在尝试使用 node 和 socket io 构建一个简单的聊天应用程序 我正在遵循此处列出的教程 http socket io get started chat http socket io get started chat 我的问题
  • 如何从Jira REST API获取一段时间内的所有工作日志?

    我正在使用 PHP 和 Jira REST API 编写一个应用程序 该应用程序需要生成特定时间段的报告 其中包含一个人在特定项目上花费的时间的累积 为此 我需要打一个电话 给出类似的信息 e g For the period 01 01
  • 如何从 doPost 函数获取变量传递给 Html 模板

    大家好 我正在使用 Google 脚本中的 doPost 函数创建电子邮件 OTP 模板 实际上 我有一个应用程序 当用户请求 OTP 时 他的详细信息 如姓名 电子邮件和应用程序生成的 OTP 将发送到此脚本 然后它将电子邮件发送给用户
  • 如何让 typedef 类型从类型类的母类型继承运算符

    发布答案后续问题 Brian 提供了答案 并建议使用提升和转移的解决方案 然而 我找不到足够的关于举重和转移的教程信息 无法知道如何调整他的答案来完成我需要做的事情 在这里 我在黑暗中工作 并使用给出的答案作为即插即用模板来提出这个后续问题
  • C++ 函数参数中的指针与引用 [重复]

    这个问题在这里已经有答案了 我想知道如何让一个函数改变两个变量 返回值和另一个变量 我偶然发现在参数 我理解是指参数的地址 之前使用 调用该函数 然后在整个函数中 用 符号引用它 我猜这是 取消引用 意味着它改变了地址处的对象 不管怎样 一
  • 将 HTML 高度设置为 100% 可消除滚动

    我不明白为什么这不起作用 我需要将 HTML 和正文的高度设置为 100 以设置页面内三行的高度 但是当我这样做时 它会消除滚动 特别是在移动设备上 甚至在某些浏览器窗口大小调整大小时也是如此 html body height 100 di
  • 制作一个具有响应宽度且仅 CSS 的箭头形状

    我正在尝试制作一个带有向上箭头的容器 我熟悉边框绘制技巧 https stackoverflow com questions 7073484 how does this css triangle shape work并认为这是一个可能的解决
  • PyPI 区分大小写吗?

    PyPI 如何处理区分大小写 例如 这个问题 https stackoverflow com questions 17460747 change case of package name on pypi记录 PyPI 拒绝新包foobar
  • 如何更改vmlite android的屏幕尺寸?

    我安装了这很棒 但有一件事我找不到解决方案 如何更改屏幕尺寸 它有一个固定的屏幕宽度 高度比例 但我需要改变它来模拟一些Android手机 我搜索了很多但没有找到解决方案 请帮忙 UPDATE grub菜单如下 cmdline hd0 2
  • SqlDataAdapter.Dispose 实际上是否关闭关联的 SqlConnection?

    有谁知道 SqlDataAdapter Dispose 方法是否实际关闭或处置任何 SqlConnections 我加载了 Reflector 发现 SqlDataAdapter 继承自 DbDataAdapter 如果我反汇编并查看该类中
  • Android dataBinding - 如何使用 bool 资源触发布局的可见性

    我目前在 android 中有一个 bool xml 文件 如下所示
  • 如何在没有任何权限检查的情况下从相对路径获取最小绝对路径?

    假设我有两个路径字符串 一个是绝对路径字符串 例如 C abc xyz 以及一个相关的 例如 def 我如何可靠地将它们组合起来以产生最小形式 C abc def 由于该过程应该适用于 NET 的 I O API 支持的任何形式的路径 即
  • Python3 PyQt4 创建一个简单的 QCheckBox 并更改布尔变量

    所以我一直在尝试使用Python 3 3和PyQt4编写一个GUI 我已经完成了一些教程 但仍然无法弄清楚如何让复选框检查和取消检查全局变量中的触发更改 我无法让它触发任何事情 因为所有教程都使用对我不起作用的方法 该程序太大 无法作为一个
  • Perl 增量运算符

    a 10 b a a a print b 我得到了答案 37 谁能解释一下这个操作是如何进行的以及结果是如何得到 37 的 按照我的逻辑 它应该是 36 a a a 11 12 13 36 但我得到了答案 37 Perl 的执行方式为 a
  • 带有变量的sql use语句

    我正在尝试使用 SQL 语句切换当前数据库 我已尝试以下操作 但所有尝试均失败 1 USE DatabaseName 2 EXEC sp sqlexec Sql where Sql USE DatabaseName 添加更多细节 编辑 我想
  • 复制构造函数省略? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么析构函数只被调用一次 https stackoverflow com questions 6422114 why has the destructor been called only once