为什么要调用移出对象的析构函数?

2024-02-17

考虑下面的代码:

struct foo {
  std::string id;
};

int main() {
  std::vector<foo> v;

  {
    foo tmp;
    v.push_back(std::move(tmp));
  }
}

LIVE DEMO http://coliru.stacked-crooked.com/a/dd5ab085542c15a7

在这段代码中演示了:

  1. 类的默认构造函数foo将被调用来构造对象tmp.
  2. 类的移动构造函数foo将在声明中调用v.push_back(std::move(tmp));.
  3. 的析构函数class foo将被调用两次。

问题:

  1. 为什么移出对象的析构函数被调用两次?
  2. 从真正被移动的物体中移动了什么?

为什么移动对象的析构函数被调用两次?

第一个析构函数销毁移出的tmp当它第一次超出范围时} in main()。第二个析构函数破坏了移动构造的foo那你push_back'd into v在......的最后main() when v超出范围。

从真正被移动的物体中移动了什么?

编译器生成的移动构造函数 move-constructsid,这是一个std::string。的移动构造函数std::string通常获取存储实际字符串的移出对象中的内存块的所有权,并将移出对象设置为有效但未指定的状态(实际上,可能是空字符串)。

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

为什么要调用移出对象的析构函数? 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • 具有多行项目的微调器与 Froyo 上的所选项目显示重叠

    我正在尝试创建在所有 Android 版本 直到 Froyo 上看起来都相同的 Spinner 为此 我正在使用无处不在的全息 https github com Prototik HoloEverywhere 一些微调器项目文本超过一行 我
  • 在 Visual Studio 2019 中,WCF 服务(启用 AJAX)不在添加 --> 新项中

    我正在尝试创建一个 Rest Web 服务 并且是 Visual Studio 2019 的新手 创建项目后 我尝试通过右键单击该项目并转到 添加 gt 新项目 来获取 WCF 服务 启用 AJAX 但是 我在任何地方都没有看到这项服务 我
  • 通过 R 中的 geom_text 将小于号“<”添加到 ggplot

    简短版本 我如何使这个人为的代码绘制出正确的希腊贝塔字符和标签字符串的其余部分 以及空格和小于字符以及格式化为键入的数字 library ggplot2 df lt data frame a 1 15 b 6 20 ggplot data
  • JavaScript 数组解构赋值和空值

    我正在使用外部服务getListOfItemsFromServiceA它接受一个id 用户 并返回与该用户关联的 5 个项目 正好 5 个 的列表 我使用数组解构赋值来设置那些工作正常的项目的值 如下所示 仅是一个示例 var item1
  • Automake 变量来整理 Makefile.am

    我有一个目录 src 包含所有源文件 bin 用来在运行 make 命令后存储所有二进制文件 该目录如下所示 BuildDirectory src bin configure Makefile am configure ac 现在在 Mak
  • 注意:未定义索引:变量

    我正在尝试构建以下表格
  • 在Java中,当文件被其他线程锁定时,有没有办法读取该文件?

    因此 我使用以下命令在文件上创建锁定 以便我可以专门对其进行编辑 File file new File filename channel new RandomAccessFile file rw getChannel lock channe
  • HTML5 视频 - 暂停加载/部分加载

    有没有办法预加载视频的一部分 而不是整个视频 我注意到有一个 暂停 事件 表明视频预计不会下载 直到有进一步指示 但我不确定如何触发此事件 我的目标是预加载视频的一部分而不占用所有用户的带宽 Thanks 您可以使用 XHR 预取任何 UR
  • Java SafeVarargs 注释,是否存在标准或最佳实践?

    我最近接触到了java SafeVarargs注解 谷歌搜索 Java 中的可变参数函数不安全的原因让我很困惑 堆中毒 擦除类型 所以我想知道一些事情 是什么使得可变参数 Java 函数在 SafeVarargs有什么意义 最好以深入示例的
  • 自定义包名称 cxf-codegen-plugin

    想象一下这个场景 我有一个名称空间为 a b c 的 wsdl 文件 它导入另一个名称空间为 m n o 的 wsdl 文件 不幸的是 它们都定义了相同的 ComplexTypes XYZ 现在 当我使用 cxf codegen plugi
  • grep IP 地址和开放端口 nmap

    我正在尝试使此脚本使用 nmap 的开放端口来 grep IP 地址 但我无法以正确的方式执行此操作 我有这样的事情 nmap 192 168 0 0 24 sU p 44555 grep oP 0 9 1 3 3 0 9 1 3 gt o
  • 支持 CORS 的服务器发送事件

    我在用ServiceStack 中的服务器发送事件 https github com ServiceStack ServiceStack wiki Server Events我需要允许它跨来源使用 我已经设置了ServiceStackCor
  • C++:有意限制 CPU 使用

    在我的公司 我们经常在 CPU 压力下测试 USB 和 FireWire 设备的性能 我们运行一个测试代码来加载 CPU 它经常用于非常简单的非正式测试 以了解我们的设备性能会发生什么变化 我查看了相关代码 它是一个简单的循环 它增加计数器
  • Python正则表达式处理不同类型的日期

    我正在尝试编写一个正则表达式来识别一些日期 我正在处理的字符串是 string these are just rubbish 11 2 2222 24 3 1695 194475 12 13 1111 32 11 2000 these ar
  • 如何在调用 gnuplot 时保持 PyQt5 响应?

    我正在尝试使用 Python GUI 和 gnuplot 创建绘图 我正在用 Python 生成代码并将其发送到 gnuplot 这基本上适用于将数据传输到 gnuplot 但是 缺点 Python 程序将被阻止 直到您关闭 gnuplot
  • CL.exe 退出代码

    有人知道我在哪里可以获得 CL exe 退出代码列表及其含义吗 谷歌在这方面不是我的朋友 我得到的特定代码 4 似乎也没有得到任何点击 虽然代码 4 的含义很好 但我更喜欢一个实际上列出所有代码的网站 无证 但进程返回 Windows 错误
  • QSharedPointer::isNull() 和 operator!() 之间的区别

    在 Qt 文档中我们读到 bool QSharedPointer operator const Returns true if this object is null This function is suitable for use in
  • 其余暴露的 spring-data 的全局异常处理

    使用 spring data rest 公开存储库我想覆盖默认的异常处理 阅读文档在我看来最好的方法是使用 ControllerAdvice 注释类 ControllerAdvice class GlobalControllerExcept
  • 使用 post 时未定义索引

    我在 POST 变量上收到未定义的索引错误 IE POST 主机名 我知道为什么我会得到它们 但是有没有办法将 php 和表单保存在同一个文件中并且不会出现这些错误 h1 Please enter your database informa
  • 为什么要调用移出对象的析构函数?

    考虑下面的代码 struct foo std string id int main std vector