The following
MyTest testObj = {};
is not zero-initialization for MyTest
, but is simply calling its default constructor. The cppreference page explains why (emphasis mine):
As part of value-initialization sequence for non-class types and for members of value-initialized class types that have no constructors, including value initialization of elements of aggregates for which no initializers are provided.
MyTest
is a class type, and a has a constructor.
Defining the constructor with
MyTest() = default;
will instead zero-initialize the object.
Relevant Standard quotes (emphasis mine) below.
From [dcl.init#8]:
To value-initialize an object of type T means:
if T is a (possibly cv-qualified) class type with either no default constructor ([class.ctor]) or a default constructor that is user-provided or deleted, then the object is default-initialized;
if T is a (possibly cv-qualified) class type without a user-provided or deleted default constructor, then the object is zero-initialized and the semantic constraints for default-initialization are checked, and if T has a non-trivial default constructor, the object is default-initialized;
…
From [dcl.init.list]:
List-initialization of an object or reference of type T is defined as follows:
…
Otherwise, if the initializer list has no elements and T is a class type with a default constructor, the object is value-initialized.