There's one difference that A1
and A3
are aggregate type, while A2
is not, because it has a user-defined constructor.
class type (typically, struct or union), that has
- ...
- no user-provided
, inherited, or explicit (since C++17)
constructors (explicitly defaulted or deleted constructors are allowed) (since C++11)
- ...
It means for A1
and A3
they could be aggregate initialized, while A2
can't.
A1 a1{99}; // fine; n is initialized to 99
A3 a3{99}; // fine; n is initialized to 99
A2 a2{99}; // error; no matching constructor taking int found
Will the compiler not zero-initialize a1.n
, a2.n
, a3.n
as per the C++ standard?
According to the rule of default initialization, if they're of automatic storage duration, no zero-initialization here, all values will be indeterminate. On the other hand, static and thread-local objects get zero initialized.