I am very confused about value- & default- & zero-initialization. and especially when they kick in for the different standards C++03 and C++11 (and
The following answer extends the answer https://stackoverflow.com/a/620402/977038 which would serve as a reference for C++ 98 and C++ 03
Quoting the answer
C++11 (In reference to n3242)
8.5 Initializers [dcl.init] specifies that a variable POD or non POD can be initialized either as brace-or-equal-initializer which can either be braced-init-list or initializer-clause aggregately referred to as brace-or-equal-initializer or using ( expression-list ). Previous to C++11, only (expression-list) or initializer-clause was supported though initializer-clause was more restricted then what we have in C++11. In C++11, initializer-clause now supports braced-init-list apart from assignment-expression as was in C++03. The following grammar summarizes the new supported clause, where the part is bold is newly added in the C++11 standard.
initializer:
    brace-or-equal-initializer
    ( expression-list )
brace-or-equal-initializer:
    = initializer-clause
    braced-init-list
initializer-clause:
    assignment-expression
    braced-init-list
initializer-list:
    initializer-clause ...opt
    initializer-list , initializer-clause ...opt**
braced-init-list:
    { initializer-list ,opt }
    { }
Like C++03, C++11 still supports three form of initialize
Note
The part highlighted in bold has been added in C++11 and the one that is striked out has been removed from C++11.
Performed in the following cases
To zero-initialize an object or reference of type T means:
- if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression, converted to T;
- if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class subobject is zero-initialized and padding is initialized to zero bits;
- if T is a (possibly cv-qualified) union type, the object’s first non-static named data member is zero initialized and padding is initialized to zero bits;
- if T is an array type, each element is zero-initialized;
- if T is a reference type, no initialization is performed.
Performed in the following cases
To default-initialize an object of type T means:
- if T is a (possibly cv-qualified)
non-PODclass type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);- if T is an array type, each element is default-initialized;
- otherwise, no initialization is performed.
Note Until C++11, only non-POD class types with automatic storage duration were considered to be default-initialized when no initializer is used.
To value-initialize an object of type T means:
- if T is a (possibly cv-qualified) class type (Clause 9) with a user-provided constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
- if T is a (possibly cv-qualified) non-union class type without a user-provided constructor,
then every non-static data member and base-class component of T is value-initialized;then the object is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is called.- if T is an array type, then each element is value-initialized;
- otherwise, the object is zero-initialized.
So to summarize
Note The relevant quotation from the standard is highlighted in bold