为什么 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 返回的对象没有立即销毁 的相关文章

随机推荐

  • 如何通过保持“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