为什么 emplace_back() 会有这样的行为?

2023-12-07

  1. 为什么 ~Base() 在调用 emplace_back() 之后立即被调用
  2. 为什么在析构函数调用后可以访问 sayHello()
  3. 为什么 ~Base() 再次被调用
#include <iostream>
#include <vector>

class Base
{
    private:

        static int m_count;

    public:

        Base()
        {
            std::cout << " Base created. Count = " << ++m_count << std::endl;
        }

        ~Base()
        {
            std::cout << " Base destroyed. Count = " << --m_count << std::endl;
        }

        void sayHello() const
        {
            std::cout << " Base says hello" << std::endl;
        }
};

int Base::m_count = 0;

int main()
{
    {
        std::vector< Base > vBase;

        vBase.emplace_back ( Base() );  // <- Why does ~Base() get called here

        vBase[0].sayHello(); // <- Why is this function accessible after call to dtor
    }
    return 0;
}

程序输出...

Base created. Count = 1  
Base destroyed. Count = 0  
Base says hello
Base destroyed. Count = -1

在通话中vBase.emplace_back ( Base() );你首先创建一个Base目的。该向量创建了另一个向量Base到位以及第一方拥有的资源Base然后搬进新的。然后删除第一个碱基。在你的向量中你现在有一个移动的构造Base这就是为什么要调用sayHello() works.

你可能想做的是让emplace_back实际上就地构造对象,而无需手动创建临时对象。您只需提供构造一个所需的参数即可做到这一点Base。就像这样:

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

为什么 emplace_back() 会有这样的行为? 的相关文章

随机推荐

  • 缩放后重新计算面板滚动位置

    将 C 表单应用程序与 PictureBox 嵌入面板中 以便在图像和 PictureBox 需要水平或垂直滚动 时利用其他帖子中建议的面板自动滚动 想要缩放图像并重新计算 AutoScrollPosition 以在缩放后保持相同的点可见
  • 调用sink()后R输出没有出现

    我有一组复杂的 R 脚本 并决定通过调用所有与调试相关的消息message 我试图找到一种方法来抑制所有消息 并偶然发现了这个SO post 建议我尝试使用sink 所以我将以下代码行插入到我的脚本中 并设置我的config debug m
  • 如何制作一个不会被优化掉的无限空循环?

    The C11标准似乎暗示具有常量控制表达式的迭代语句不应被优化 我的建议来自这个答案 其中特别引用了标准草案中的第 6 8 5 节 其控制表达式不是常量表达式的迭代语句 可以由实现假定终止 在那个答案中它提到了一个像这样的循环while
  • C++向量,这段代码是什么意思?

    我有这个代码 const int maxnodes 5000 struct Edge int to rev int f cap vector
  • 如何在快速滚动时自定义 Alpha 索引器

    我有一个ListView with AlphaIndexer实施使用SectionIndexer 我想知道是否可以自定义快速滚动时显示的 Alpha 索引器框 即更改其颜色 背景 文本字体 颜色等 例如 Edited或者 当该框与FastS
  • 隐藏 NULL 行组 JasperReports

    有没有办法在 Crosstab 中隐藏具有 NULL 值的行组 None
  • 是否有相当于 data.table::rleid 的 dplyr?

    data table提供了很好的便利功能 rleid对于游程编码 library data table DT data table grp rep c A B C A B c 2 2 3 1 2 value 1 10 rleid DT gr
  • 如何在 Weblogic 12c (12.1.3) 上部署 Spring Boot 应用程序?

    我正在尝试在 Weblogic 12c 12 1 3 上部署一个简单的 Spring Boot 应用程序 在开发人员环境中它确实可以完美运行 然而 当需要在战争中重新包装它并将其附加到耳朵上时 这似乎无法正确部署 这是堆栈跟踪
  • MySQL |如何让每个类别只选择一条记录?

    我有一个表 其中包含带有数据的记录 每个记录都属于一个类别 假设我有以下表格 ID Category Title Date 1 Cat 1 Ttl 1 2013 02 18 2 Cat 2 Ttl 2 2013 02 18 3 Cat 1
  • Laravel Pusher array_merge:期望参数 2 是一个数组,给定 null

    我正在按照 Pusher 的教程在网站上显示通知 一切都符合教程 但是当我尝试访问通知时 出现了这个特定的错误localhost 8000 test我不知道如何解决它 错误信息 预期结果 通知发送消息 输出 array merge 错误 相
  • SQL 视图中的动态架构名称

    我有两个数据集 一个是关于狗的数据 我的数据 第二个是匹配键的查找表 我无法控制这些数据 匹配的键定期更新 我想创建 Dog 数据集的视图 或实现相同目的的东西 它总是连接最近的匹配的键 此外 我需要能够内联引用它 就好像它是一张桌子一样
  • 请求期间出现意外异常

    我在用着apache cassandra 2 2 4 我有一个 4 四 节点集群 DC1 中的复制因子为 3 DC2 中的复制因子 1 其中 DC1 包含 3 三 个节点 DC2 包含 1 一 个节点 该集群中之前还有一些节点 但由于某种原
  • 使用SAF(存储访问框架)的Android SD卡写入权限

    经过大量关于如何在 SD 卡 android 5 及更高版本 中写入 和重命名 文件的发现后 我认为 android 提供的新 SAF 将需要获得用户的许可才能写入 SD 卡文件 我在这个文件管理器应用程序中看到ES文件浏览器最初它会按照以
  • 监视调用 Jest 中另一个函数的导入函数

    我试图监视由另一个函数调用的函数 这两个函数都驻留在外部文件中并导入 Funcs spec js import as Funcs from Funcs describe funcA gt it calls funcB gt jest spy
  • 如何制作这样的回归树?

    我想制作一棵如图所示的回归树 这棵树是用 Cubist 完成的 但我没有那个程序 我确实使用 R 和 Python 它似乎与 R 包 rpart 或 tree 不同 因为末端节点是线性公式而不仅仅是平均值 有什么办法可以使用 R 或其他一些
  • ASP.NET LinkBut​​ton OnClick 事件在主页上不起作用

    我有一个用户控件来处理用户登录到我的网站的情况 该用户控件作为快速登录框放置在所有页面的右上角 我遇到的问题是 在我的生产服务器上 我为登录和重置提供的 LinkBut ton 单击事件在回发后不会触发 OnClick 事件 就像它只是忘记
  • 使用 python 正则表达式删除括号之间的内容

    我有一个文本文件 例如 a abc b c d 我想删除这些括号之间的内容 and 所以输出应该是 abc 我删除了括号之间的内容 但无法删除这之间的内容 我试过下面的代码 import re with open data txt as f
  • Mac 上的 VBA (Excel) 词典?

    我有一个 Excel VBA 项目 该项目大量使用 Windows 脚本字典对象 我最近有一位用户尝试在 Mac 上使用它并收到以下错误 Compile Error Can t find project or library 这是使用的结果
  • 在网页上加载 javascript 时输入意外结束

    我的 输入意外结束 的情况与我迄今为止在 SO 和其他论坛中发现的所有情况有所不同 坦白说 我被困住了 我在 CentOS 机器上安装了 JBoss EAP 6 4 尝试在 Windows 7 机器上打开管理控制台 MS 的所有最新补丁 都
  • 为什么 emplace_back() 会有这样的行为?

    为什么 Base 在调用 emplace back 之后立即被调用 为什么在析构函数调用后可以访问 sayHello 为什么 Base 再次被调用 include