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.