【问题标题】:C++0x non-ambiguity of Generalized Initializers通用初始化器的 C++0x 非歧义性
【发布时间】:2011-10-31 06:21:31
【问题描述】:

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

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

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

所以还是这样,告诉人们“更喜欢{}-syntax,你的源代码不会有不同的含义,这取决于Tv是什么” .

【问题讨论】:

  • 这真的很难回答,因为最终标准尚未公开。我尝试查看第 8.5 节的活动问题。一切似乎都与小问题有关。所以我认为答案是“是”,但我不太确定。
  • 是的,我也尝试关注讨论。不过,有些人必须有权访问最终版本... ;-)
  • 请记住T a[] = {v};T a[1] = {v}; 相同,与T a[2] = {v};非常不同(如果v 只是一个值)跨度>

标签: c++11 initialization curly-braces


【解决方案1】:
  • T x{v}; -- 用值 v 初始化了一个 T 类型的变量 x。
  • T x = {v}; -- 相同,因为 = 在这里只是可选的。

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

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

从 13.3.1.7 开始:

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

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

【讨论】:

  • 谢谢!我错过了。我认为是从 Scott Meyers 幻灯片(约 1 岁)或 Bjarnes(>3 岁)中得到的。
猜你喜欢
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多