C++ 0x广义初始化器的非模糊性

tow*_*owi 1 initialization curly-braces c++11

我找到了几个使用新的Initializer语法的例子{...}.但这些例子已经很老了.我只是想交叉检查 - 目前的情况仍然如描述的那样?

在每个上下文(特别是模板)中,以下源片段始终是非模糊的 - 无论是什么Tv不是.

  • T{v};- 始终构造临时类型T并使用值初始化它v.
  • T x{v};- 初始化带有值x的类型变量.Tv
  • T x = {v};- 同样,因为=这里只是可选的.
  • T a[] = {v};- 使用值初始化数组的所有元素v.
  • p = new T{v};- T在堆上分配类型的对象并使用值初始化它v.

因此,它仍然是正确的,告诉人们"更喜欢{}-syntax,你的源代码不会有不同的含义,取决于什么Tv是什么".

Nic*_*las 6

  • T x{v}; - 初始化类型为T的变量x,其值为v.
  • T x = {v}; - 同样,因为=这里只是可选的.

就N3291(最终标准之前的最后一份工作草案)而言,这些并非所有可能的vT.

主要区别如下.第一个是显式构造函数调用,因此可以选择声明的构造函数explicit.第二个不是显式构造函数调用(即使它将调用构造函数).因此它无法选择explicit构造函数.

从13.3.1.7开始:

在复制列表初始化中,候选函数是T的所有构造函数.但是,如果选择了显式构造函数,则初始化是错误的.

这样做的目的是确保explicit在使用复制初始化时,即使使用{}语法,也不会意外地执行值的转换.