1

我发现了几个使用{...}. 但是这些例子已经很老了。我只是想核对一下——目前的情况是否仍然如所描述的那样?

在每个上下文(尤其是模板)中,以下源代码片段始终是明确的——不管是什么Tv是。

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

因此,告诉人们“更喜欢{}-syntax,你的源代码不会有不同的含义,这取决于what Tand vare”仍然是正确的。

4

1 回答 1

6
  • T x{v};-- 用值 v 初始化了一个 T 类型的变量 x。
  • T x = {v};-- 相同,因为 = 在这里只是可选的。

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

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

从 13.3.1.7 开始:

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

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

于 2011-08-20T20:57:09.707 回答