A default constructor for a class X
is a constructor of class X
for which each parameter
that is not a function parameter pack
has a default argument
(including the case of a constructor with no parameters).
If there is no user-declared constructor for class
X,
a non-explicit constructor having no parameters is implicitly declared
as defaulted ([dcl.fct.def]).
An implicitly-declared default constructor is an
inline public member of its class.
X is a non-union class that has a variant member M
with a non-trivial default constructor and
no variant member of the anonymous union containing M
has a default member initializer,
any non-variant non-static data member of const-qualified type (or array
thereof) with no brace-or-equal-initializer
is not const-default-constructible ([dcl.init]),
any potentially constructed subobject, except for a non-static data member
with a brace-or-equal-initializer, has
class type M (or array thereof) and either M
has no default constructor or overload resolution ([over.match])
as applied to find M's corresponding
constructor results in an ambiguity or in a function that is deleted or
inaccessible from the defaulted default constructor, or
A default constructor
that is defaulted and not defined as deleted
is
implicitly defined
when it is odr-used ([basic.def.odr])
to create an object of its class type ([intro.object]),
when it is needed for constant evaluation ([expr.const]), or
when it is explicitly defaulted after its first declaration.
The implicitly-defined default constructor performs the set of
initializations of the class that would be performed by a user-written default
constructor for that class with no
ctor-initializer and an empty
compound-statement.
If that user-written default constructor would be ill-formed,
the program is ill-formed.
If that user-written default constructor would satisfy the requirements
of a constexpr constructor ([dcl.constexpr]), the implicitly-defined
default constructor is constexpr.
Before the defaulted default constructor for a class is
implicitly defined,
all the non-user-provided default constructors for its base classes and
its non-static data members are implicitly defined.
[class.base.init] describes the order in which constructors for base
classes and non-static data members are called and
describes how arguments can be specified for the calls to these constructors.