我使用{...}
找到了一些新初始化语法的示例。但这些例子已经很老了。我只想反复核对 - 目前的情况是否还如上所述?
在每个上下文(尤其是模板)中,以下源片段始终非模糊 - 无论T
和v
是什么。
T{v};
- 始终构建T
类型的临时文件,并使用值v
对其进行初始化。T x{v};
- 初始化了x
类型为T
的变量v
。T x = {v};
- 同样,因为=
在这里只是可选的。T a[] = {v};
- 使用值v
初始化数组的所有元素。p = new T{v};
- 在堆上分配类型为T
的对象,并使用值v
对其进行初始化。因此,它仍然是正确的,告诉人“首选{}
- 语法,您的源代码不会有不同的含义,具体取决于T
和v
是“
答案 0 :(得分:6)
T x{v};
- 初始化类型为T的变量x,其值为v。T x = {v};
- 同样,因为=这里只是可选的。就N3291(最终标准之前的最后一份工作草案)而言,对于所有可能的v
和T
,这些都不相同。
主要区别如下。第一个是显式构造函数调用,因此可以选择声明为explicit
的构造函数。第二个是不显式构造函数调用(即使它将调用构造函数)。因此无法选择explicit
构造函数。
从13.3.1.7开始:
在copy-list-initialization中,候选函数是T的所有构造函数。但是,如果选择了显式构造函数,则初始化是不正确的。
这样做的目的是确保在使用复制初始化时,即使使用explicit
语法,也不会意外地执行{}
值转换。