https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108993
--- Comment #7 from Pablo Anigstein <panigstein at hotmail dot com> --- (In reply to Jonathan Wakely from comment #5) > (In reply to Jonathan Wakely from comment #3) > > (In reply to Pablo Anigstein from comment #2) > > > (In reply to Andrew Pinski from comment #1) > > > > Hmm, > > > > I noticed that since GCC 7 with -std=c++17, the b.x is not initialized > > > > at > > > > all. So the question I have is there a difference between C++ standards > > > > here? > > > > Derived is an aggregate in C++17, so b{} does aggregate init, not value > > init. > > And that means its Base subobject is copy-initialized from {} which means we > get a value-initialized object, so it's correct that b.x is not initialized > in C++17 (which is what is shown in your godbolt link, because you didn't > specify any -std option to override the -std=gnu++17 default). > > With -std=c++14 it looks like b.x is always set to zero, if I'm reading the > assembly output correctly (but I'm probably not). Here is an updated example: https://godbolt.org/z/YePjhxKE4. Note that now Derived is not an aggregate for any standard version due to the private member. Still zero-initialization does not happen for the Base sub-object for the case where Base has a user-provided default constructor when compiling with -O1 and above.