tow*_*owi 1 initialization curly-braces c++11
我找到了几个使用新的Initializer语法的例子{...}.但这些例子已经很老了.我只是想交叉检查 - 目前的情况仍然如描述的那样?
在每个上下文(特别是模板)中,以下源片段始终是非模糊的 - 无论是什么T和v不是.
T{v};- 始终构造临时类型T并使用值初始化它v.T x{v};- 初始化带有值x的类型变量.TvT x = {v};- 同样,因为=这里只是可选的.T a[] = {v};- 使用值初始化数组的所有元素v.p = new T{v};- T在堆上分配类型的对象并使用值初始化它v.因此,它仍然是正确的,告诉人们"更喜欢{}-syntax,你的源代码不会有不同的含义,取决于什么T和v是什么".
T x{v}; - 初始化类型为T的变量x,其值为v.T x = {v}; - 同样,因为=这里只是可选的.就N3291(最终标准之前的最后一份工作草案)而言,这些并非所有可能的v和T.
主要区别如下.第一个是显式构造函数调用,因此可以选择声明的构造函数explicit.第二个不是显式构造函数调用(即使它将调用构造函数).因此它无法选择explicit构造函数.
从13.3.1.7开始:
在复制列表初始化中,候选函数是T的所有构造函数.但是,如果选择了显式构造函数,则初始化是错误的.
这样做的目的是确保explicit在使用复制初始化时,即使使用{}语法,也不会意外地执行值的转换.