In the first, you copy-initialize a
from a value-initialized instance of MyClass
. From the C++03 standard, §8.5/7:
An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.
And from §8.5/5:
To value-initialize an object of type T
means:
- if
T
is a class type with a user-declared constructor, 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 non-union class type without a user-declared constructor, then every non-static data member and base-class component of T
is value-initialized;
- if
T
is an array type, then each element is value-initialized;
- otherwise, the object is zero-initialized
To zero-initialize an object of type T
means:
- if
T
is a scalar type, the object is set to the value of 0
(zero) converted to T
;
- if
T
is a non-union class type, each nonstatic data member and each base-class subobject is zero-initialized;
- if
T
is a union type, the object’s first named data member) is zero-initialized;
- if
T
is an array type, each element is zero-initialized;
- if
T
is a reference type, no initialization is performed.
In the second, you declare b
in a manner that would cause it to be default-initialized if MyClass
were not a POD type -- §8.5/5:
To default-initialize an object of type T means:
- if
T
is a non-POD class type, 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, the object is zero-initialized.
However, because MyClass
is a POD type, b
is uninitialized -- §8.5/9:
If no initializer is specified for an object, and the object is of (possibly cv-qualified) non-POD class type (or array thereof), the object shall be default-initialized; if the object is of const-qualified type, the underlying class type shall have a user-declared default constructor. Otherwise, if no initializer is specified for a non-static object, the object and its subobjects, if any, have an indeterminate initial value; if the object or any of its subobjects are of const-qualified type, the program is ill-formed.