在初始化中省略重要的复制/移动构造函数是否合法?

2023-12-21

鉴于此应用程序:

#include <iostream>

struct X {
  X(int _x)                   { x = _x     + 1; }
  X(const X& that)            { x = that.x + 10; }
  X& operator=(const X& that) { x = that.x + 100; return *this; }
  X(X&& that)                 { x = that.x + 1000; }
  X& operator=(X&& that)      { x = that.x + 10000; return *this; }
  int x;
};

int main() {
  X a(1);
  std::cout << "a.x=" << a.x << std::endl;
  X b = 2;
  std::cout << "b.x=" << b.x << std::endl;
  X c = X(3);
  std::cout << "c.x=" << c.x << std::endl;
  X d = a;
  std::cout << "d.x=" << d.x << std::endl;
}

我预计输出是:

a.x=2
b.x=1003
c.x=1004
d.x=12

然而我得到的是:

a.x=2
b.x=3
c.x=4
d.x=12

实例 http://rextester.com/IRR1416

获得我的预期输出的唯一方法是编译-fno-elide-constructors (example http://rextester.com/QKSH83987)

我认为编译器可能不会删除一些东西,如果这样做会影响观察到的行为,但 GCC、clang 和 MSVC 似乎就是这么做的。

我是否遗漏了一些一般规则,或者它是否特定于临时对象初始化?


即使忽略副作用,复制省略也是允许发生的:

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

一个好的通用规则是不要编写依赖于复制/移动构造函数副作用的代码,因为您很容易被省略所困扰。在 C++17 中尤其如此,其中某些复制省略情况是强制性的。

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

在初始化中省略重要的复制/移动构造函数是否合法? 的相关文章

  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • 无法形成对 NSTextView 类实例的弱引用

    仅使用 Swift 这是我在 AppDelegate swift 中的代码 import Cocoa class AppDelegate NSObject NSApplicationDelegate IBOutlet var window
  • WPF 中的 DataTemplate 和 DataContext 有什么区别?

    我可以通过以下方式设置视图模型和视图之间的关系DataContext syntax
  • SwiftUI 点击手势选择错误的项目

    所以我正在尝试创建一个自定义图像选择器 类似于 Instagram 但更基本 这就是我使用它创建屏幕的方法 struct NewPostScreen View StateObject var manager SelectNewPostScr
  • 如何在 ion-checkbox 中使用 ngModel?

    我正在尝试与 ngModel 一起使用 但 ngModel 在那里不起作用 我的代码
  • Java中的AVL树旋转

    我想实现Java AVL树并左右旋转树 我不明白这个 任何人都可以通过查看下面的代码告诉我如何左右旋转树 然后使用 fix up 与这两个函数来平衡 AVL 树 我希望这里有人可以指导我完成这个任务 import java util Ran
  • 是否自定义会员资格

    我正在 ASP NET MVC3 中创建网站 足球 足球 我希望拥有用户 具有默认会员资格的用户的附加信息 这些是普通访问者 和玩家 我认为最好他们继承用户并拥有一些附加信息如衣号 玩家还可以发布文章 用户可以只评论文章 做到这一点的最佳方
  • 过滤堆叠元素的多个放置处理程序中断

    我有一些 div 设置为 droppable 的元素可以接收从图库中拖放到其上的缩略图 img 元素也被设置为接受这些缩略图 因此我可以在图像之上添加图像 放置处理程序从缩略图中恢复图像并将其附加到正文中 当多个 div 和 imgs 堆叠
  • MUI 自动完成(多个)控制值 - 神秘的输入行为

    我正在尝试编写代码以在键盘输入时异步搜索多选组合 然而我在最新版本 5 2 2 中发现了一个我无法解释的奇怪行为 我提炼出以下问题 基于 MUI 自动完成页面的示例 import as React from react import Tex
  • 与父实体一起逐出依赖集合

    我刚刚意识到 当一个对象从 Hibernate 缓存中被逐出时 依赖集合 如果被缓存 必须被驱逐分别地 http jaitechwriteups blogspot com 2006 08 evict collection from hibe
  • 如何使用 c#.net 读取 XML 中的 XML 节点

    我有一个如下所示的 XML 文件
  • Vaadin Valo 页面不会滚动

    我正在基于原生 Valo 主题创建一个新的 Vaadin 主题 升级到 Vaadin 7 3 Valo 由其他人完成 后 页面内容将不再滚动 除了整个页面本身之外 页面上应用了溢出属性的所有其他元素都可以正常工作 我知道我可以应用这个 v
  • Netlogo的执行顺序是怎样的?

    请问我这句话正确吗 如果我写 ask turtles go forward go backward 随机一只乌龟向前移动然后向后移动 然后第二只随机乌龟会做同样的事情 依此类推 这是否正确 相对于 ask turtles go forwar
  • 如何在 Firefox 中使用 php curl 发送推送消息

    我已经为 Chrome 实现了推送通知 当我需要向 GCM 发送推送消息时 我使用了以下 PHP 函数 function send push message subscription ids Set GCM endpoint url htt
  • C# .NET 支持 IDispatch 后期绑定吗?

    问题 我的问题是 C 本身支持后期绑定 IDispatch 吗 Pretend我正在尝试自动化 Office 同时与客户安装的任何版本兼容 在 NET 世界中 如果您在安装了 Office 2000 的情况下进行开发 则从现在到世界末日 每
  • 如何在 Gradle 构建中使用为 jar 文件提供的范围?

    我需要在我的应用程序中使用 Amazon Maps 和 Amazon Messaging 使用 gradle 我没有成功添加具有 提供 范围的 Amazon 依赖项正如他们需要的那样 https developer amazon com s
  • Swift 与泛型类型的条件一致性

    我正在尝试使用两种通用类型来使用 Swift 扩展 我试着举个例子 我们有一个盒子 可以容纳不同类型的物品 class Box
  • 求和间隔

    我必须对这样的间隔进行求和 1 6 2 4 The result is 1 6 so there are 6 numbers in the end 这是另一个例子 4 6 8 10 14 16 4 5 6 8 9 10 14 15 16 t
  • Docker 最佳实践:容器的单一进程

    码头工人最佳实践 https docs docker com engine articles dockerfile best practices 指南指出 您应该只在单个容器中运行单个进程 Nginx 和 PHP FPM 应该在单独的容器中
  • 使用 CString 进行 PInvoke

    我正在尝试使用 P Invoke 从 C 调用非托管 C DLL 中的函数 C DLL 使用CString 作为函数参数和返回值 例如 CString AFX EXT API GetUserName CString userID 不幸的是
  • 在初始化中省略重要的复制/移动构造函数是否合法?

    鉴于此应用程序 include