“显式”关键字对返回值优化 (RVO) 有何影响?

2024-06-03

以下代码工作得很好(显示 RVO):

struct A { 
  A (int) { cout << "A::A()\n"; }  // constructor
  A (const A&) { cout << "A::A(const A&)\n"; }  // copy constructor
};

A foo () { return A(0); }

int main () {
  A a = foo();
}

Output:

A::A()  // --> which means copy constructor is not called

如果我将复制构造函数标记为explicit:

explicit A (const A&) { ... }

然后编译器报错:

explicit.cpp: In function ‘A foo()’:
explicit.cpp:10:22: error: no matching function for call to ‘A::A(A)’
 A foo () { return A(0); }
                      ^
explicit.cpp:5:3: note: candidate: A::A(int)
   A (int) { cout << "A::A()\n"; }
   ^
explicit.cpp:5:3: note:   no known conversion for argument 1 from ‘A’ to ‘int’
explicit.cpp: In function ‘int main()’:
explicit.cpp:14:13: error: no matching function for call to ‘A::A(A)’
   A a = foo();
             ^
explicit.cpp:5:3: note: candidate: A::A(int)
   A (int) { cout << "A::A()\n"; }
   ^
explicit.cpp:5:3: note:   no known conversion for argument 1 from ‘A’ to ‘int’

为什么会发生这种情况,RVO 不应该按原样工作吗?


RVO 可以删除副本,但语言规则要求副本(或移动)必须仍然是可能的:

[C++14: 12.8/31]:当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。[..]

[C++14: 12.8/32]: [..] [ Note:无论是否发生复制省略,都必须执行此两阶段重载决策。如果不执行省略,它确定要调用的构造函数,并且即使省略调用,所选构造函数也必须可访问。——尾注]

您通过添加使复制变得不可能explicit,并且移动是不可能的,因为您的复制构造函数会阻止创建隐式定义的移动构造函数。

您可以通过添加自己的移动构造函数(也许是默认的构造函数)来允许移动:

A(A&&) = default;

但这只是遵守同一语言规则的另一种方式。

无论如何,C++17 将通过添加一些不受此约束的复制省略保证来稍微放宽该规则。

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

“显式”关键字对返回值优化 (RVO) 有何影响? 的相关文章

随机推荐

  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h
  • Networkx 中 Louvain 分区的可视化

    请帮助我更改 Louvain 聚类算法结果的可视化 我从网站上获取了代码https github com taynaud python louvain https github com taynaud python louvain我可以重写
  • SwiftUI 切换开关

    我正在尝试实现一个简单的切换开关 但在保存新的切换 开关状态时遇到问题 因为当我更改视图并返回设置时 它默认返回到关闭开关 你能告诉我我做错了什么吗 struct StudyMode View State private var overd
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • 在 Firebase 中手动插入数据

    我正在使用 Angular js 和 Firebase 创建一个应用程序 在界面正常工作之前 我计划手动插入数据 虽然添加键 值对很容易 但我无法弄清楚如何构建多个级别的数据 例如添加一个内部有多个条目的对象 如果我导入 json 文件 它
  • 如何安装DBMonitor

    这可能是一个非常简单的问题 但就是这样 我刚刚更新了 Firebird 的 DevArt DBExpress 驱动程序的许可证 帮助文件说我可以使用他们的免费软件 DBMonitor 应用程序 但由于我使用的是 D2006 所以我必须使用以
  • 使用 Amazon EC2 接收电子邮件?

    我使用 EC2 服务器发送电子邮件没有遇到任何问题 但如何检查发送给我的电子邮件 我有弹性 IP 设置并修改了反向 DNS 记录 我需要安装 Postfix 才能接收电子邮件吗 确保端口 25 在您的服务器上处于活动状态并打开 在您的实例上
  • 如何为每个用户或系统范围配置 Ivy 缓存目录?

    我在用SBT http www scala sbt org 作为我构建 Scala 项目的构建工具 我的问题是 我无法配置 SBT 将依赖项下载到我的用户主目录 因此 我正在寻找每个用户甚至更好的系统范围设置来告诉 SBT 将 Ivy 缓存
  • PostgreSQL:循环直到条件为真

    我正在尝试编写一个查询 该查询从指定值开始 循环 数据库 直到条件为真 例如 假设我在 TABLE 示例中有以下条目 id parent cond 1 True 2 1 False 3 1 False 4 2 False 我想要一个以 4
  • 应用程序网关如何防止请求发送到最近终止的 Pod?

    我目前正在 Azure 中研究和试验 Kubernetes 我正在使用 AKS 和应用程序网关入口 据我了解 当 Pod 添加到服务时 端点会更新 入口控制器会不断轮询此信息 随着新端点的添加 AG 也会更新 当它们被移除时 AG 也被更新
  • 如何使用完全空的类型使 Activator.CreateInstance 运行速度减慢约 20 倍

    Given NET 程序集命名expression host NET 程序集命名CreateInstanceTest CreateInstanceTest 在其配置文件中启用 NetFx40 LegacySecurityPolicy exp
  • 使用 MVC5、Ajax、C# 和 MSSQL Server 级联 DropdownList

    我对来自 Windows 窗体和三层架构的 MVC 非常陌生 我试图找出使用从数据库填充的级联下拉列表 DDL 我使用 MS SQL Server 2012 VS 2013 目前我正在研究用户调查问卷 用户可以从 DDL 的多个答案中进行选
  • 实现 PHP 单例:静态类属性还是静态方法变量?

    所以 我总是像这样实现一个单例 class Singleton private static instance null public static function getInstance if self instance null se
  • 如何使用批处理文件将多个命令插入到批处理文件中

    我正在制作一个批处理文件 我们称之为 Create bat 它将创建一个批处理文件 我们称之为 Created bat 该文件将在其中插入多个命令 其中一条命令如下 FOR F x IN tasklist NH FI IMAGENAME e
  • Windows 2k8 上的 Coldfusion 10 - .com/ 加载正常,但 .com/index.cfm 给出 404

    我正在按照 Pete Freitag 的新 CF10 锁定指南设置一台新服务器 CF10 W2K8 我安装了一个测试站点 如果我打开 www mydomain com 它会加载默认文档 index cfm 但是 如果我尝试 www mydo
  • Angular 2 在没有 @Input 或 @Output 的情况下监视组件属性的更改

    在 Angular 1 x 中 我可以使用 watch 来观看我想要的任何内容 但是在 Angular 2 中 我们有 ngOnChanges 它非常酷且高性能 但只能监视输入和输出装饰器 然而 有时我确实需要观察本地属性 以便在它们发生变
  • Powershell - 从图像网址下载图像

    对 powershell 的了解有限 我尝试从图像网址下载图像 例如这样 http hdwallpaperia com wp content uploads 2014 01 Mc Laren P1 Wallpaper Image Pictu
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • “显式”关键字对返回值优化 (RVO) 有何影响?

    以下代码工作得很好 显示 RVO struct A A int cout lt lt A A n constructor A const A cout lt lt A A const A n copy constructor A foo r