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

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(使用前将#替换为@)

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

随机推荐

  • 通过 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