为什么从初始化列表启动向量时不使用移动构造(通过隐式构造函数)

2024-02-15

为了演示移动语义,我编写了以下示例代码,其中包含 int 的隐式构造函数。

struct C {
  int i_=0;
  C() {}
  C(int i) : i_( i ) {}
  C( const C& other) :i_(other.i_) {
    std::cout << "A copy construction was made." << i_<<std::endl;
  }
  C& operator=( const C& other) {
    i_= other.i_ ;
    std::cout << "A copy assign was made."<< i_<<std::endl;
    return *this;
  }
  C( C&& other ) noexcept :i_( std::move(other.i_)) {
    std::cout << "A move construction was made." << i_ << std::endl;
  }
  C& operator=( C&& other ) noexcept {
    i_ = std::move(other.i_);
    std::cout << "A move assign was made." << i_ << std::endl;
    return *this;
  }
};

And

auto vec2 = std::vector<C>{1,2,3,4,5};
cout << "reversing\n";
std::reverse(vec2.begin(),vec2.end());

带输出

A copy construction was made.1
A copy construction was made.2
A copy construction was made.3
A copy construction was made.4
A copy construction was made.5
reversing
A move construction was made.1
A move assign was made.5
A move assign was made.1
A move construction was made.2
A move assign was made.4
A move assign was made.2

现在,背面显示了 2 个两个交换(每个交换使用一个移动分配和两个移动结构),但为什么是临时的C从初始化列表创建的对象无法移动?我以为我有一个整数的初始值设定项列表,但我现在想知道我之间是否有一个 Cs 的初始值设定项列表,其中can't被移出(作为其常量)。这是正确的解释吗? - 这是怎么回事?

现场演示 http://ideone.com/MQqMGd


我以为我有一个整数的初始值设定项列表,但我现在想知道我之间是否有一个 Cs 的初始值设定项列表,它无法从中移动(作为其常量)。这是正确的解释吗?

这是对的。vector<C>没有initializer_list<int>构造函数甚至initializer_list<T>某些模板参数的构造函数T。它所拥有的是initializer_list<C>构造函数 - 它是由您传入的所有整数构建的。由于initializer_list是一个 const 数组,你会得到一堆副本而不是一堆移动。

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

为什么从初始化列表启动向量时不使用移动构造(通过隐式构造函数) 的相关文章

随机推荐

  • 使用 Blogger API v3 和 Python 插入博客文章草稿

    我正在尝试使用 Blogger Api v3 客户端库发布一篇文章 https developers google com blogger docs 3 0 libraries https developers google com blo
  • NSPredicate 和数组

    我有一个简短的问题 我有一个NSArray洋溢着Cars 继承自 NSObject Car有 property NSString engine 也被视为 synthesize 现在我想使用过滤数组NSPredicate predicate
  • Bootstrap 中的固定页脚

    我正在尝试引导程序 http getbootstrap com 我想知道 如果内容滚动 如何修复底部的页脚而不使其从页面上消失 要让页脚粘在视口底部 请给它一个固定位置 如下所示 footer position fixed height 1
  • Vue.js v-if 对变量变化没有反应

    我正在使用 vue js 并且在正确使用 v if 方面遇到了一些困难 我正在尝试在模板内渲染条件模板 在创建的方法中 变量isloaded设置为 true 这应该会导致模板重新呈现并让 正在加载数据 消息消失 然而 日志表明 2s 的延迟
  • 如何添加 .NET Framework 安装先决条件

    我在 Microsoft Visual Studio 中有一个 C Windows 窗体项目2017 我添加了 Visual Studio 安装程序安装向导项目来为我的应用程序创建安装程序 这是我第一次使用安装程序项目 安装程序正确地具有
  • 按复杂标准合并/连接 2 个 DataFrame

    我有 2 个大型数据集 每个数据集有 70K 到 110K 我想关联 比较两者 并根据某些条件 标准查找 set2 中的哪些项目可以在 set1 中找到 我当前的策略是按公共字段对两个列表进行排序 然后运行嵌套for循环 执行条件if测试
  • 在客户端用 JavaScript 逐行读取文件

    您能帮我解决以下问题吗 Goal 在客户端 通过 JS 和 HTML5 类在浏览器中 逐行读取文件 无需将整个文件加载到内存中 Scenario 我正在开发应该在客户端解析文件的网页 目前 我正在阅读本文件中描述的文件article htt
  • 如何在同一端口中运行 Angular 和 Node.JS Express?

    这可能是重复的问题 但无法理解如何配置 FE 和 BE 一起运行它们 我已经经历过this https stackoverflow com q 39845526 and this https stackoverflow com q 4678
  • 使用“from x import *”记录文件

    sphinx 的 automodule 和其他自动功能可用于记录包含以下内容的模块from x import 声明不包含导入模块的所有文档 编辑 根据mzjn的观点 只要导入的方法 module 属性与模块名称不同 不应记录它们 然而 对于
  • FBSDKLoginManager 代码从 Objective-C 到 swift

    任何人请帮助我如何将 FBSDKLoginManager 代码转换为快速编程提前感谢我附上 Objective C 中的代码 IBAction btnFacebookPressed id sender FBSDKLoginManager l
  • 使用二维动态分配字符串创建动态分配结构

    我正在尝试扫描字母网格 cases是字母网格的数量 r c是每个网格的行数和列数 我想我可以创建一个内部包含二维数组的结构数组 我已经为此工作了几个小时 但它仍然给我带来问题 警告 警告 C4477 12号线 scanf s 格式字符串 s
  • dexing时如何查找错误原因:MethodHandle.invoke和MethodHandle.invokeExact

    我有一个项目在 Android Studio 或 Gradle 中构建时开始抛出此错误 com android tools r8 ApiLevelException MethodHandle invoke and MethodHandle
  • 使用 PHPUnit 发送 POST 请求

    我有一个 symfony 网站 我正在尝试进行一些单元测试 我有这样的测试 我尝试提交一些东西
  • 忽略 BinaryFormatter 序列化中的非序列化属性

    我有一堂课叫User它是 Serializable 并继承自基类IdentityUser实体框架类且不可序列化 我有房产在Booking类与类型User and Booking类是Serializable我正在尝试使用序列化预订对象Bina
  • 边框半径被内部 div 隐藏

    我有一个 div 作为内容框 并在其中有另一个 div 作为标题 外部 div 设置了 border radius 但内部 div 隐藏了它 HTML div div This is the title div div CSS box he
  • `jcmd PID GC.class_histogram`会在收集数据之前调用完整GC吗?

    当我跑步时jcmd PID help GC heap dump 帮助中明确指出会调用full GC 除非 all指定标志 GC heap dump 影响 高 取决于 Java 堆大小和内容 除非指定了 all 选项 否则请求完整 GC al
  • 服务在短时间内(1分钟)后被终止

    我创建了一项服务 其工作是在用户关闭应用程序时清除通知 一切都运行得很好但是有时 当应用程序在后台运行超过 1 分钟时 服务就会被终止 这意味着通知不会被取消 为什么会发生这种情况 我认为停止服务的唯一方法是使用 stopSelf 或 st
  • 基于多索引 pandas 数据框使用 matplotlib 绘制误差条

    我在 pandas 中有以下数据框 gt gt gt name Hour trt level stress date value 0 D43 9 H control 2019 06 07 0 4561 1 D43 10 H control
  • 如何摆脱 Git 子模块未跟踪状态?

    我似乎无法摆脱 Git 子模块中未跟踪的内容 跑步git status yields On branch master Changes not staged for commit use git add to update what wil
  • 为什么从初始化列表启动向量时不使用移动构造(通过隐式构造函数)

    为了演示移动语义 我编写了以下示例代码 其中包含 int 的隐式构造函数 struct C int i 0 C C int i i i C const C other i other i std cout lt lt A copy cons