首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T v{}初始化

T v{}初始化
EN

Stack Overflow用户
提问于 2014-09-21 21:45:59
回答 2查看 1K关注 0票数 19

我在读C++11标准,但不知道是否

代码语言:javascript
复制
T x{};

值初始化或默认初始化(自动存储)。它确实非常清楚地指出:

10其初始化器为空括号集(即() )的对象应为值初始化。

那就是

11如果没有为对象指定初始化器,则该对象是默认初始化的;

但是我所能找到的关于T x{};的所有信息是:

表单T(A);T{a}以及新表达式(5.3.4)、static_cast表达式(5.2.9)、函数符号类型转换(5.2.3)以及基和成员初始化器(12.6.2)中发生的初始化称为直接初始化。

如果初始化器是(非括号大小的)大括号内列表,则对象或引用是列表初始化(8.5.4)。

我不熟悉阅读标准的程度。有人能给我指明正确的方向吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-21 22:02:42

你的话确实涵盖了这一点:

如果初始化器是(非括号大小的)大括号内列表,则对象或引用是列表初始化(8.5.4)。

跳到8.5.4列表-初始化。在这里,我解释/省略了一些与T x{}的情况无关的要点

列表-对象或T类型引用的初始化定义如下:

  • 如果T是一个聚合,则执行聚合初始化(8.5.1)。
  • 否则,如果初始化程序列表没有元素,而T是一个具有默认构造函数的类类型,则该对象是值初始化的。
  • 否则,如果Tstd::initializer_list<E>的专门化.
  • 否则,如果列表不是空的,并且它与构造函数匹配
  • 否则,如果列表只有一个元素
  • 否则,如果T是引用类型
  • 否则,如果初始化程序列表没有元素,则对象是值初始化的.
  • 否则的话,这个程序是不正确的.

第一点,聚合初始化也是在C++03中进行的;在这种情况下,T x{};T x = {};相同。

对于第二点"T是具有默认构造函数的类类型“,它是值初始化的,这意味着调用默认构造函数。

如果T是一个基元类型,那么第二到最后一点就会应用,并且它再次被值初始化。

回到聚合初始化的情况,在8.5.1/7中有:

如果列表中的初始化者-子句少于聚合中的成员,则未显式初始化的每个成员都应从其大括号或等初始化项中初始化,或者如果没有大括号或等初始化项,则从空初始化程序列表(8.5.4)中初始化。

大括号或等号初始化器是指类定义中内联提供的初始化器。如果不存在这种情况,那么它就会被初始化,就好像该成员已经用{}初始化了一样(因此,这个逻辑被递归地应用于每个聚合成员)。

例如,

代码语言:javascript
复制
struct T
{
     int a;
};

然后,T x {};导致a被初始化为int a{};,这是值初始化,因为int是一个基本类型。

票数 26
EN

Stack Overflow用户

发布于 2014-09-21 22:11:04

虽然Matt McNabb已经讨论过这一点,但我要补充的是,如果您在浏览标准时遇到了问题,那么查看cppreference并不会有什么影响。他们在list initialization上的部分很好地分解了它。

从本质上说,正如您的标准引语所述,T x{};指的是:

用大括号括起来的表达式或嵌套列表(大括号-init- list )初始化命名变量。

和:

T类型对象的列表初始化的效果如下:

  • 如果大括号-init-列表为空且T是具有默认构造函数的类类型,则执行值初始化。

..。

  • 否则,如果大括号-init-列表没有元素,则T为值初始化。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25964198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档