I\'m reading the C++11 standard, but can\'t figure out whether
T x{};
is value-initialized or default initialized (automatic storage). It
This is indeed covered by your quote:
If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized (8.5.4).
Skipping down to 8.5.4 List-initialization. Here I have paraphrased/omitted some points that don't pertain to the case of T x{}:
List-initialization of an object or reference of type T is defined as follows:
- If T is an aggregate, aggregate initialization is performed (8.5.1).
- Otherwise, if the initializer list has no elements and T is a class type with a default constructor, the object is value-initialized
- Otherwise, if
Tis a specialization ofstd::initializer_list[...]- Otherwise, [if the list is not empty and it matches a constructor]
- Otherwise, [if the list has a single element]
- Otherwise, [if
Tis a reference type]- Otherwise, if the initializer list has no elements, the object is value-initialized.
- Otherwise, the program is ill-formed.
The first point, aggregate initialization was in C++03 as well; in that case T x{}; is the same as T x = {};.
For the second point "T is a class type with a default constructor", it is value-initialized which means calling the default constructor.
If T is a primitive type then the second-to-last point applies and it is value-initialized again.
Going back to the aggregate initialization case, in 8.5.1/7 there is:
If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from its brace-or-equal-initializer or, if there is no brace-or-equal-initializer, from an empty initializer list (8.5.4).
The brace-or-equal-initializer refers to an initializer provided inline in the class definition. If that isn't present then it is initialized as if the member had been initialized with {} (so, this logic is recursively applied for each aggregate member).
For example,
struct T
{
int a;
};
then T x {}; leads to a being initialized as if it were int a{}; , which is value-initialization since int is a primitive type.