为什么在 std::vector 的初始化列表中调用复制构造函数?

2024-03-22

我有以下非常简单的课程:

class Foo 
{
public:
  Foo() {}
  Foo(const Foo&) = delete;
  Foo(Foo&&) {}

  void operator=(const Foo&) = delete;
  void operator=(Foo&&) {}

  void dump() const {}
};

该类是可移动构造和可分配的,但不可复制构造和可分配的。

我想使用向量的初始化列表来初始化 Foo 元素的向量。

std::vector<Foo> vf = { Foo() };

编译器会抱怨,因为代码必须使用已删除的复制构造函数。有人可以解释一下,为什么在这种情况下不使用移动构造,以及为什么需要对象的副本?

以下还需要复制构造函数,但也不起作用:

std::vector<Foo> vf = { std::move(Foo()) };

另一方面,这工作正常(调用移动构造函数):

std::vector<Foo> vf;
vf.push_back(Foo());

感谢您的解释... :)

Update:

一个建议this https://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics帖子解释了我的问题。

此外,让我们考虑以下代码(连同class Foo above):

class Bar {
public:
    Bar(std::initializer_list<Foo> _l) {
        std::cout << "Bar::Bar()" << std::endl;
        for (auto& e : _l)
            e.dump();
    }
};

int main() {
    Bar b { Foo() };
    return 0;
}

这会产生以下输出(用 C++11 编译):

Foo::Foo()
Bar::Bar()
Foo::dump()
Foo::~Foo()

可以看出,初始化列表实际上并未填充大括号之间声明的“对象的副本”。对于 C++14 来说,这可能不是真的。


这具体是因为你使用初始化列表 http://en.cppreference.com/w/cpp/utility/initializer_list使用复制构造函数。初始化列表是用copy对象的,然后传递给向量。

如果您阅读链接的参考文献,从 C++14 开始,它甚至明确地说

...每个元素是复制初始化...来自原始初始化列表的相应元素

Emphasis mine

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

为什么在 std::vector 的初始化列表中调用复制构造函数? 的相关文章

  • 谁能建议我一种在 C++ 中分割名称的简单方法

    我一直在尝试将名称分为名字和姓氏 但我确信我的实现就简单性而言并不是最好的 string name John Smith string first string last name name find getting lastname fo
  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • letrec、命名let和内部定义的常见用法?

    我有几本关于Scheme的书 其中一些提到了名为let和letrec的书 但没有一本真正给出了令人信服的例子 我的意思是 我何时以及为何使用其中一个而不是另一个 是否存在 letrec named let 确实是比内部定义甚至外部辅助过程更
  • 如何在一个文件中使用java中的多个类?

    我想知道如何在java中的一个文件中使用多个类 我输入了这段代码 但它显示编译错误 class test int a b c void getdata int x int y a x b y void add c a b System ou
  • 基于WordNet测量语义相似度,Brown Corpus有什么用

    我遇到了几种使用 WordNet 的结构和层次结构来测量语义相似性的方法 例如Jiang and Conrath测度 JNC Resnik测度 RES 林测度 LIN 等 使用 NLTK 测量它们的方式是 sim2 wn jcn simil
  • 通过Android USB主机与智能卡读卡器通信

    我正在尝试向智能卡发送命令 我用一个金雅拓 IDBridge CT30 PC TWIN 读卡器 http www smartcardfocus com images content GEMTR jpg and a ID桥K30 http c
  • 动态创建的 href 点击事件在 Firefox 或 Safari 中不起作用?

    我正在使用 javascript 动态创建 ahref 标签来下载使用 javascript 代码生成的 csv 文件 以下代码在 chrome 中运行良好 但在 safari 或 firefox 中不起作用 var a document
  • Blazor [WASM] System.TypeLoadException:无法解析带有令牌 0100001a 的类型

    我收到此错误 enter code hereSystem TypeLoadException 无法从 typeref 解析带有标记 0100001a 的类型 程序集 System Runtime Version 4 2 2 0 Cultur
  • 更新 javascript 表:未捕获类型错误:对象 [object Object] 没有方法 'tableRow'

    我正在制作一个联系人应用程序 它使用用户输入更新表格 但一旦输入数据 似乎无法更新表格 我只收到上面的错误 不知道如何改变方法 我尝试了很多不同的功能等 但没有运气 var nameField addressField emailField
  • MS Teams 客户端上内部托管的图像无法访问

    我们已经在我们的企业团队中启用了 Bot Framework 应用程序 并且我们想要使用AdaptiveCards向用户呈现丰富的内容 例如 我们正在发送AdaptiveImage包含指向企业形象店的url 示例代码 new Adaptiv
  • PHP 全局目录 UTF-8

    我正在尝试获取变量路径中的所有文件 atm 我正在使用 glob 但我只是找不到打开其中包含 的路径的方法 我尝试了很多解码 编码 但似乎都不起作用 当我更改文件名和变量中的 时 我得到了正确的答案 所以它必须是 utf8 字符 我猜 PH
  • AOSP的libc++.so和NDK的libc++_shared.so一样吗?

    我正在开发一款 Android 应用程序 其中有一个共享库 我在 Android Studio 中构建 我们称之为libA so 由供应商动态加载另一个共享库提供程序 我们称之为libB so 我知道我不应该在我的应用程序中使用多个 C 运
  • BitBlt 不在硬件加速模式下捕获窗口

    我目前正在使用 GDI32 dll 捕获窗口快照 尽管我遇到了硬件加速 Windows 的问题 我想知道是否有办法规避 我在这里发现了这段令人惊奇的代码 public static Image CaptureWindow IntPtr ha
  • 通过引用使用临时对象和参数的规则

    说我有一堂课 class A public A 和一个函数 void x const A s 我这样做 x A 有人可以向我解释有关通过引用传递临时对象的规则吗 就编译器允许的内容而言 在哪里需要 const 是否发生隐式复制等等 从尝试来
  • Rcurl 与 http 数据发布

    我想将以下curl调用移至Rcurl curl http myserver org stream H Authorization Basic XXXXXXXX H Connection keep alive data binary limi
  • 如何使用 Java 实例化 ArrayList 并通过反射添加项目?

    我正在编写一个将 xml 转换为 Java 对象的反序列化方法 我想动态地执行此操作 并避免编写对特定类型的硬编码引用 例如 这是我的一门课程的简化版本 public class MyObject public ArrayList
  • 优秀 Java 桌面应用程序的示例 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • EditText 与下面的建议列表

    我想在我的应用程序中实现 Google instant 之类的列表 顶部有一个 editText 下面有一个列表 每次用户输入新字符时都会更新该列表 你能指出我正确的方向吗 是否有任何小部件或任何我可以使用的东西 或者我是否必须删除列表并在
  • Firebase实时数据库单值侦听器多次触发

    我正在尝试从其他值侦听器中的数据库接收数据 类 MyFragment Fragment private lateinit var reference DatabaseReference override fun onCreate saved
  • 我如何知道哪些处理程序在 Promise 中抛出错误?

    假设我有如下承诺 p then Task1 then Task2 then Task3 catch errorHandler When Task2遇到错误 我怎么知道错误来自Task2 in catch 每个人 我自己研究了演示代码 希望大
  • 使用 Microsoft IIS 创建下载链接

    我想使用 Microsoft IIS 设置直接下载链接 我们已经有一个使用 IP 地址的网页 该地址指向我们服务器上的 web 文件夹 但我想在我的服务器上创建一个单独的位置 我可以在其中放置可下载的文件 以便客户端只需键入链接即可获取下载
  • 为什么在 std::vector 的初始化列表中调用复制构造函数?

    我有以下非常简单的课程 class Foo public Foo Foo const Foo delete Foo Foo void operator const Foo delete void operator Foo void dump