Reputation: 1218
I'm debugging some code that essentially is identical to this:
struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };
When I make an instance of Bar
, it seems like both a
and b
are initialized to zero. Is this guaranteed? Where can I find that in the spec?
Upvotes: 8
Views: 497
Reputation: 1334
According to cppreference.com
If the number of initializer clauses is less than the number of members [and bases (since C++17)] or initializer list is completely empty, the remaining members [and bases (since C++17)] are initialized [by their default member initializers, if provided in the class definition, and otherwise (since C++14)] by empty lists, in accordance with the usual list-initialization rules (which performs value-initialization for non-class types and non-aggregate classes with default constructors, and aggregate initialization for aggregates). If a member of a reference type is one of these remaining members, the program is ill-formed.
Foo
has no default member initializers (int b{0};
), so b
will be initialized by list-initialization with an empty list, which means value-initialization for non-class types: b = int() // = 0
.
Upvotes: 5