两种形式的初始化有什么区别,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
构造函数,则代码格式错误。 - 如果
T
是auto
, 然后:- 复制列表初始化推导出
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/