为什么 std::move 返回的对象没有立即销毁

2024-01-11

我测试了以下代码:

#include <iostream>
using namespace std;
class foo{
public:
    foo()       {cout<<"foo()"<<endl;}
    ~foo()      {cout<<"~foo()"<<endl;}
};

int main()
{
    foo f;
    move(f);
    cout<<"statement \"move(f);\" done."<<endl;
    return 0;
}

输出是:

foo()
statement "move(f);" done.
~foo()

然而,我期望:

foo()
~foo()
statement "move(f);" done.

根据move函数的源码:

  template<typename _Tp>
    constexpr typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t) noexcept
    { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

返回的对象是正确的值,那么为什么不立即销毁呢?



-------------------------------------------------- ----------------
我想我只是混淆了右值和右值引用。
我修改了我的代码:

#include <iostream>

template<typename _Tp>
constexpr typename /**/std::remove_reference<_Tp>::type /* no && */
/**/ mymove /**/ (_Tp&& __t) noexcept
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

using namespace std;
class foo{
public:
    foo()       {cout<<"foo() at "<<this<<endl;} /* use address to trace different objects */
    ~foo()      {cout<<"~foo() at "<<this<<endl;} /* use address to trace different objects */
};

int main()
{
    foo f;
    mymove(f);
    cout<<"statement \"mymove(f);\" done."<<endl;
    return 0;
}

现在我得到了我一直期待的东西:

foo() at 0x22fefe
~foo() at 0x22feff
statement "mymove(f);" done.
~foo() at 0x22fefe

移出一个对象并不会改变它的生命周期,只会改变它的当前值。你的对象foo返回时被销毁main,它在你的输出之后。

此外,std::move不离开物体。它只是返回一个右值引用,其引用对象是对象,使其成为possible离开物体。

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

为什么 std::move 返回的对象没有立即销毁 的相关文章

  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler

随机推荐

  • 如何通过保持“templateurl”不变来编译 Angular 2 Webpack

    Webpack 通过在中生成 js 来编译 typescript 文件dist文件夹 我发现 webpack 正在将所有 templateurl 更改为 template 如下所示 我的打字稿组件 Component selector ap
  • CListCtrl:如何保持水平滚动位置?

    如何保持 CListCtrl 的水平滚动条位置 我定期转储并重新填充列表控件的内容 因此无需明确记住旧位置并恢复它 滚动就会返回到左上角 我问了一个相关问题 CListCtrl 如何保持滚动位置 https stackoverflow co
  • 雪豹上的 python 需要 32 位 libxml2 吗?

    我在我的 sl mbp 上安装 scrapy 真是太麻烦了 它需要 libxml2 所以我开始安装它 从 macports 安装它似乎并没有拉下 python 绑定 通过 scrapy 的说明从源代码安装它 here http doc sc
  • 在Eclipse中导入ant build.xml

    我有一个使用ant构建的android项目 是否可以在eclipse IDE中导入这个ant项目 更新 有一个选项可以使用 ant 创建项目build xml在 Eclipse 中 现有 ant Buildfile 中的文件 gt 新建 g
  • 按降序对两列最常见的组合进行排序

    我的数据框看起来像这样 A B C 1 3 1 2 1 1 2 3 1 1 2 1 3 1 1 1 2 1 2 1 1 1 3 1 1 2 1 我想将数据减少为仅按降序排序的两列 A 和 B 最常见的组合 输出应该看起来像 A B coun
  • 淘汰赛手风琴绑定断裂

    以下绑定在 1 9 之前有效 ko bindingHandlers accordion init function element valueAccessor var options valueAccessor setTimeout fun
  • 如何将版本信息添加到我的 powershell 脚本中?

    我有一个脚本 test ps1 如下所示 但我希望能够运行 test ps1 version并让它返回当前的version剧本给我 有没有办法做到这一点 lt SYNOPSIS Test DESCRIPTION Desc INPUTS No
  • 使用外部框架将 Vue3 自定义元素集成到 Vue2 应用程序中

    我有一个用 Vue2 编写的应用程序 它还没有真正准备好升级到 Vue3 但是 我想开始在 Vue3 中编写一个组件库 并将组件导入回 Vue2 以便在准备就绪后最终进行升级 Vue 3 2 引入defineCustomElement它工作
  • 更改选择标签中单独选项的 css font-family

    我不知道这是否可能 如果不可能 是否有人可以提出可选的想法 但我试图在选择标签中显示不同字体的下拉菜单 特别是来自 Google 字体目录的字体 在下拉列表中 我尝试通过使用其代表的字体设置每个选项的样式来显示预览
  • IFrame 内 ExtJS 5 应用程序的滚动问题

    Hy 这就是我的测试页面的样子 蓝色区域是父页面 绿色区域是运行 ExtJS 应用程序的 IFrame 内部带有标签的简单视口 如果网站在触摸设备 iPad Android 平板电脑等 上执行 则无法通过在 IFrame 绿色区域 上 擦拭
  • Django choicefield 的初始值

    我遇到一个奇怪的问题 我似乎无法在 django 中的表单中设置其中一个字段的初始值 我的模型字段是 section models CharField max length 255 choices Application Applicati
  • JTextField 与 HTML 标签一起

    我正在研究 Java 7 我正在尝试使用 HTML 标签来格式化文本 我将文本传递到 JTextField text new JTextField text setText p The program performs encryption
  • Elixir 向所有订阅者直播

    我正在尝试在 Elixir 中实现一个无线电服务器 一个进程始终在工作并读取文件 mp3 并发布到主题 radio 当前用于测试目的 当它完成时会重新开始 每个连接订阅主题 radio 我不明白如何将块发送到所有订阅的连接 连接在 2 或
  • 我如何使用 wxwidgets 在 C++ 中访问串行端口数据

    我是电子与通信工程专业的学生 我正在开发一个项目 其中微控制器将数据发送到计算机的串行端口 异步 我目前正在为我的 GUI 工作学习 wxWidgets 我的问题 是否可以使用wxWidgets来获取数据并显示 实施起来是不是非常困难呢 我
  • 如何从 Base 64 字符串获取 MIME-TYPE?

    我从后端获取字符串的 base64 然后用 Javascript 对其进行解码以在浏览器上显示 该字符串可以是任何文件 pdf img docx zip 等 我的 base64 字符串不包含 mime 类型 例如 data applicat
  • 为 Typescript、es6 和 Webpack 2 配置 Jest

    在我的 tsconfig 中 我当前将模块 compilerOption 属性设置为 es6 但是 当我运行 Jest 时 我收到以下错误 Test suite failed to run Object
  • Azure.Security.KeyVault.Secrets:az 未被识别为内部或外部命令

    我正在使用 Net Core 并利用 Azure 服务 虚拟机 Windows Server 2016 数据库 PostgreSQL 和 Azure Key Vault 开发 Web 应用程序 下面是我的 csproj 文件
  • 如何获取 selenium 上所有打开的窗口和浏览器的处理程序?

    我正在寻找一种返回 url 和处理程序的方法在所有打开的窗口 选项卡和浏览器中 不仅仅是目前在 Selenium 中运行的那个 我下面的代码仅返回通过运行当前测试实例化的当前窗口 String originalWindowHandle dr
  • 使用 CryptoStream (DESCryptoServiceProvider) 解密时如何返回 byte[]

    这是一个初学者的问题 每次我在互联网上搜索时 都会解密DESCryptoServiceProvider函数总是返回一个字符串 我们怎样才能得到byte 为了回报 这是代码 感谢您的任何帮助 DESCryptoServiceProvider
  • 为什么 std::move 返回的对象没有立即销毁

    我测试了以下代码 include