我在读C++11标准,但不知道是否
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)。
我不熟悉阅读标准的程度。有人能给我指明正确的方向吗?
发布于 2014-09-21 22:02:42
你的话确实涵盖了这一点:
如果初始化器是(非括号大小的)大括号内列表,则对象或引用是列表初始化(8.5.4)。
跳到8.5.4列表-初始化。在这里,我解释/省略了一些与T x{}的情况无关的要点
列表-对象或T类型引用的初始化定义如下:
T是std::initializer_list<E>的专门化.T是引用类型第一点,聚合初始化也是在C++03中进行的;在这种情况下,T x{};与T x = {};相同。
对于第二点"T是具有默认构造函数的类类型“,它是值初始化的,这意味着调用默认构造函数。
如果T是一个基元类型,那么第二到最后一点就会应用,并且它再次被值初始化。
回到聚合初始化的情况,在8.5.1/7中有:
如果列表中的初始化者-子句少于聚合中的成员,则未显式初始化的每个成员都应从其大括号或等初始化项中初始化,或者如果没有大括号或等初始化项,则从空初始化程序列表(8.5.4)中初始化。
大括号或等号初始化器是指类定义中内联提供的初始化器。如果不存在这种情况,那么它就会被初始化,就好像该成员已经用{}初始化了一样(因此,这个逻辑被递归地应用于每个聚合成员)。
例如,
struct T
{
int a;
};然后,T x {};导致a被初始化为int a{};,这是值初始化,因为int是一个基本类型。
发布于 2014-09-21 22:11:04
虽然Matt McNabb已经讨论过这一点,但我要补充的是,如果您在浏览标准时遇到了问题,那么查看cppreference并不会有什么影响。他们在list initialization上的部分很好地分解了它。
从本质上说,正如您的标准引语所述,T x{};指的是:
用大括号括起来的表达式或嵌套列表(大括号-init- list )初始化命名变量。
和:
T类型对象的列表初始化的效果如下:
..。
https://stackoverflow.com/questions/25964198
复制相似问题