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

时间:2011-08-20 15:56:32

标签: c++11 initialization curly-braces

我使用{...}找到了一些新初始化语法的示例。但这些例子已经很老了。我只想反复核对 - 目前的情况是否还如上所述?

在每个上下文(尤其是模板)中,以下源片段始终非模糊 - 无论Tv是什么。

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

因此,它仍然是正确的,告诉人“首选{} - 语法,您的源代码不会有不同的含义,具体取决于Tv是“

1 个答案:

答案 0 :(得分:6)

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

就N3291(最终标准之前的最后一份工作草案)而言,对于所有可能的vT,这些都不相同。

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

从13.3.1.7开始:

  

在copy-list-initialization中,候选函数是T的所有构造函数。但是,如果选择了显式构造函数,则初始化是不正确的。

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