返回非静态本地对象时选择复制构造函数而不是移动构造函数

2023-12-12

我曾经假设类的移动构造函数将优先于其复制构造函数,但在下面的代码中,即使对象应该是可移动的,似乎也会选择复制构造函数。

你知道为什么下面的代码选择复制构造函数吗foo()回报vector<B> B?

#include <iostream>
#include <vector>

using namespace std;

class B {
public:
  int var_;

  B(int var) : var_(var)
  {
    cout << "I'm normal" << endl;
  }

  B(const B& other)
  {
    cout << "I'm copy constructor" << endl;
  }

  B(B&& other)
  {
    cout << "I'm move constructor" << endl;
  }
};

vector<B> foo()
{
  vector<B> b;

  b.push_back(1);
  b.push_back(2);

  return b;
}

int main()
{
  vector<B> b {foo()};
}

结果如下图所示。

$ g++ main.cpp
$ a.out
I'm normal
I'm move constructor
I'm normal
I'm move constructor
I'm copy constructor

奇怪的是,如果我删除一行foo(),改为选择移动构造函数:

vector<B> foo()
{
  vector<B> b;

  b.push_back(1);

  return b;
}

现在结果如下:

$ g++ main.cpp
$ a.out
I'm normal
I'm move constructor

这涉及到两件事:向量重新分配和重新分配时机制的选择。

首先,重新分配发生在这里:

vector<B> foo()
{
  vector<B> b;

  b.push_back(1);
  std::cout << "Vector capacity: " << b.capacity() << " Vector size: " << b.size() << "\n";
  b.push_back(2); //capacity() == size(), reallocation is needed

  return b;
}

大多数矢量实现都会产生容量2*current_capacity when current_capacity将被超出,以符合标准要求的摊余常数复杂性。


现在,如果标记为,编译器只能选择移动构造函数进行重新分配noexcept。为了使向量使用移动构造函数,请像这样声明:

B(B&& other) noexcept
{
//
}

您可以通过预先保留空间来完全删除重新分配:

vector<B> foo()
{
  vector<B> b;
  b.reserve(2);
  b.push_back(1);
  b.push_back(2);

  return b;
}

或者通过一次性初始化向量:

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

返回非静态本地对象时选择复制构造函数而不是移动构造函数 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 绑定 odeint 变量

    我正在使用 odeint 来模拟一个系统 其中有几个变量不应小于零 是否有适当的方法将 odeint 中的变量绑定到特定范围 在odeint中不存在这种可能性 我想没有算法可以做到这一点 您必须以某种方式对 ODE 中的界限进行编码 如果您
  • excel超链接什么都没有

    我有很多超链接 我想为每个超链接分配一个宏 并且 Worksheet FollowHyperlink 仅捕获插入的超链接 但不捕获 HYPERLINK 函数 所以我希望我插入的超链接不引用任何内容 这样当我按下它们时什么也不会发生 或者我希
  • 如何在 Flask-RESTful 中添加自定义 HTTP 响应头?

    我正在使用 Flask RESTful 并且希望通过向我的响应添加自定义 HTTP 标头来处理某些错误 是否有标准的 Flask 或 Flask RESTful 方法可以做到这一点 结果我跳过了文档的那部分 class Todo3 Reso
  • Kendo Grid 移动到下一个单元格后不保存值

    我尝试修改kendo Grid的InCell编辑模式的行为 我的意思是我尝试使用箭头导航到单元格 但这样做时遇到问题 这是我的代码 grid keydown function e debugger isEditStarted true va
  • 在地图上绘制绕纬度/经度的时间半径

    我正在与gmapsdistanceR 中的包 我有我的 API 密钥 并且我熟悉包中的功能 然而 我想从相反的方向解决一个问题 而不是仅仅找到Time Distance and Status纬度 经度之间是纬度 经度的向量 我想输入一个纬度
  • x86 函数调用类型

    我是x86新手 我的问题是关于函数调用 据我所知 有三种函数调用类型 短调用 0xe8 远调用 0x9a 和近调用 0x 有些将短调用称为相对调用 ip arg cs inv 将远调用称为绝对调用 ip arg cs arg 但近调用又如何
  • 如何使用外部库 JAR 在终端中运行 Java 程序

    这应该很简单 但我以前从未这样做过 也没有找到任何解决方案 我目前正在使用 Eclipse 来编写我的程序 它导入一些外部 JAR 库 例如 google data api 库 我可以使用 Eclipse 来编译 构建 运行该程序 但现在我
  • 在表中打印查询结果

    如果我有一个名为 info 的 MySQL 表 如下所述 并且我想打印出一个 HTML 表 如下所述 我该怎么做 MySQL表中的字段 id subject category actions date status HTML 表格结构 两列
  • 从生成的表中检索数据时对象名称“dbo.TableName”无效

    我首先使用实体 框架代码来创建我的表 请注意 创建表 而不是数据库 因为我正在托管环境中工作 并且没有允许创建数据库的用户 提交数据库更新工作正常 但检索数据会出现异常 异常详细信息 System Data SqlClient SqlExc
  • 无法使用 SMO 枚举 SQL Server 2008 注册服务器

    我的工作站上安装了 SQL Server 2005 Management Studio 此后我安装了 SQL Server 2008 工作站工具并删除了 SQL Server 2005 工具 我现在正在编写一个 C 程序 它会迭代我在 Ma
  • Javascript removeEventListener 不起作用 - 事件侦听器仍然存在

    我已经研究了一些解决这个问题的方法 但我不能真正告诉 我的代码是 lb document body if lb addEventListener lb addEventListener keyup function event keyPre
  • 在文本后添加格式化符号,保留预先存在的文本的字符格式

    我想在单元格中的现有文本后插入红色勾号 或向下箭头 如何插入字符和retain单元格中预先存在的字符格式 我只对这些单元格内的一些单词进行粗体 下划线或着色 通常建议的代码将原始单元格内容的所有自定义字符格式恢复为单元格字体格式 Activ
  • 查找字符串中搜索词的所有索引

    我需要一种快速方法来查找字符串中可能出现的搜索词的所有索引 我尝试过这种 蛮力 String扩展方法 Note makes use of ExSwift extension String var length Int return coun
  • 如何向使用点阵制作的水平图添加线条(abline 不知何故不起作用)?

    我想在水平图上绘制水平线和垂直线 对应于从 74 到 76 的 x 值和从 28 到 32 的 y 值 下面是我的 R 代码 但是当我运行以下命令时 我得到了水平图 但没有线条 我也没有收到来自 R 的错误 我安装的默认主题是将值映射为粉色
  • 单实例批处理文件?

    dostuff bat echo off insert long running process call here End 如果该批处理文件在执行时已经在另一个进程中运行 我可以向该批处理文件添加什么以使其终止 好吧 如果只能有一个实例
  • 需要在单个事务中将数据存储在 SqlAzure 和表存储中。

    我的应用程序有一个场景吗 我需要将历史数据存储在表存储中 将主要数据存储在 Sql Azure 中 即 如果数据发生更新 历史数据应移动到 Azure 表存储 并且新修改的数据应在单个事务中在 Sql Azure 中更新 如果任何一个数据库
  • 与 PHP 共享 Laravel 身份验证/会话

    我正在尝试将 Laravel 身份验证与许多简单的 HTML Javascript 应用程序一起使用 我认为理想的工作方式是这样的 用户访问简单的 HTML 应用程序 这个简单的 HTML 应用程序包含一个 PHP 文件 该文件检查是否 用
  • 如何使用 pack 将一个小部件放在并排的小部件下方?

    我尝试像这样放置小部件 我不明白为什么我的代码不这样做 试图在网上寻找示例 但没有找到解决方案 而且我尝试的任何方法都没有让我更接近所请求的结果 到目前为止 这是我的代码 如果您对代码中的任何内容有任何评论 请随时告诉我 因为这是我第一次尝
  • 从 PAT 部分 (MPEG-TS) 读取信息

    我正在编写一个 MPEG TS 文件解析器 但我一直坚持从 PAT 部分获取 program numbers 和 PID 我正在使用数据包分析器来比较我的结果 例如 这是一个 PAT 数据包 47 40 00 16 00 00 B0 31
  • 返回非静态本地对象时选择复制构造函数而不是移动构造函数

    我曾经假设类的移动构造函数将优先于其复制构造函数 但在下面的代码中 即使对象应该是可移动的 似乎也会选择复制构造函数 你知道为什么下面的代码选择复制构造函数吗foo 回报vector b B include b