c++ - C++ 中的对象初始化语法( T obj = {...} 与 T obj{...} )

标签 c++ constructor initialization list-initialization uniform-initialization

两种形式的初始化有什么区别,T obj = {…}T obj{…}
我最初以为T obj = {…}T obj = T{…} 的简写其中临时对象被复制到我们的新对象中。尽管不执行复制构造函数 ( copy elision ),但需要它的存在和访问权限。但是,当我通过将构造函数设置为私有(private)来阻止此特定类中的复制构造函数访问时,没有错误。
这意味着不涉及复制机制。那么“=”符号的作用是什么?
我已提及以下问题,但因没有解释而感到不满意:
Is C++11 Uniform Initialization a replacement for the old style syntax?

编辑:类似地,int arr[]{…} 之间有区别吗?和int arr[] = {…} ?我问这个是为了看看我是否可以区分统一初始化和列表初始化之间的对比。

最佳答案

它们具有几乎完全相同的效果:

  • T x = { 1, 2, 3 };
  • T x { 1, 2, 3 };

从技术上讲,版本是 =称为copy-list-initialization,另一个版本是direct-list-initialization,但这两种形式的行为均由list-initialization<指定/em> 行为。

差异是:

  • 如果copy-list-initialization选择 explicit构造函数,则代码格式错误。
  • 如果Tauto , 然后:
    • 复制列表初始化推导出std::initializer_list<Type_of_element>
    • 直接列表初始化仅允许列表中的单个元素,并推导出 Type_of_element

更多信息:Why does the standard differentiate between direct-list-initialization and copy-list-initialization?


如果T是数组类型,那么上面的内容仍然适用;由于数组列表初始化始终是聚合初始化,因此永远不会选择构造函数,因此这两个版本在所有情况下都是相同的。


T obj = T{...} (不包括 auto )与 T obj{...} 完全相同,自 C++17 起,即 obj直接列表初始化 。在 C++17 之前,有临时的直接列表初始化,然后是 obj 的复制初始化来自临时。

关于c++ - C++ 中的对象初始化语法( T obj = {...} 与 T obj{...} ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60805366/

相关文章:

c++ - 具有来自同一个 bool C++ 的两个 if 语句的最佳实践

c++ - 类型转换指针构造函数调用

java - Spring 按名称构造函数参数 Autowiring

c++ - 错误 : wrong number of arguments specified for ‘constructor’ attribute

c++ - 对象数组如何初始化每个对象的成员变量?

c++ - 如何根据另一个 vector 对一个 vector 进行排序?

c++ - 使用 new 调整数组大小

initialization - 如何初始化包含引用的结构?

ios - 重写枚举初始化?(rawValue : String) to not be optional

c++ - 运算符重载 - 重载 *