直接列表初始化和复制列表初始化之间的差异

2024-05-02

我想知道以下两种类型是否有任何区别std::vectorC++11 及更高版本中的初始化。

std::vector<int> v1 {1, 2, 3, 4, 5};
std::vector<int> v2 = {1, 2, 3, 4, 5};

这是一个运行良好的完整代码示例。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v1 {1, 2, 3, 4, 5};
    std::vector<int> v2 = {1, 2, 3, 4, 5};

    std::cout << v1.size() << '\n';
    std::cout << v2.size() << '\n';
}

我看到两种初始化都会产生相同的结果。

示例位于http://en.cppreference.com/w/cpp/container/vector http://en.cppreference.com/w/cpp/container/vector使用第二种,所以这让我思考这种初始化是否有任何优势。

一般来说,我想知道一种初始化是否比另一种初始化具有特定的技术优势,或者一种初始化是否被认为是最佳实践,而另一种则不是,如果是,为什么。

特别是,我担心的是复制列表初始化是否会因临时对象和复制而产生额外的开销?


列表初始化被非正式地称为“统一初始化”,因为它的含义和行为是相同的不管你如何调用它。

当然,C++ 就是 C++,“预期”的事情并不总是发生。

直接列表初始化和复制列表初始化的行为之间基本上存在三个主要区别。第一个是您最常遇到的:如果列表初始化将调用标记的构造函数explicit,那么如果列表初始化形式是复制列表初始化,则会出现编译错误。

这种行为差异定义为[超过匹配列表]/1 https://timsong-cpp.github.io/cppwp/n4659/over.match.list:

在复制列表初始化中,如果explicit选择了构造函数,初始化格式错误。

这是重载解析的函数。

第二个主要区别(C++17 的新功能)是,给定具有固定基础大小的枚举类型,您可以使用基础类型的值对其执行直接列表初始化。但是你cannot从这样的值执行复制列表初始化。所以enumeration e{value};有效,但没有enumeration e = {value};.

第三个主要区别(对于 C++17 来说也是新的)与花括号初始化列表的行为有关auto扣除。通常情况下,auto其行为与模板参数推导并不太明显。但与模板参数推导不同的是,auto可以从花括号初始化列表初始化。

如果你初始化一个auto使用直接列表初始化与列表中的单个表达式的变量,编译器将推断该变量是表达式的类型:

auto x{50.0f}; //x is a `float`.

听起来很有道理。但如果对复制列表初始化做完全相同的事情,它会always可以推导出initializer_list<T>, where T是初始化器的类型:

auto x = {50.0f}; //x is an `initializer_list<float>`

非常非常统一。 ;)

值得庆幸的是,如果您在花括号初始化列表中使用多个初始化程序,则直接列表初始化auto-推导的变量总是会给出编译错误,而复制列表初始化只会给出更长的时间initializer_list。因此自动推导的直接列表初始化永远不会给出initializer_list,而自动推导出的复制列表初始化总是会的。

有一些微小的差异很少影响初始化的预期行为。在这些情况下,来自单个值的列表初始化将根据列表初始化形式使用复制或直接(非列表)初始化。这些案例是:

  1. 从与正在初始化的聚合类型相同的单个值初始化聚合。这绕过了聚合初始化。

  2. 从单个值初始化非类、非枚举类型。

  3. 初始化参考。

这些不仅不会经常发生,而且基本上不会真正改变代码的含义。非类类型没有显式构造函数,因此复制和直接初始化之间的区别主要是学术性的。参考文献也是如此。总体情况实际上只是从给定值执行复制/移动。

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

直接列表初始化和复制列表初始化之间的差异 的相关文章

  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐