Vous n'êtes pas d'appeler le constructeur par défaut, vous êtes à l'aide d'agrégation d'initialisation sur un type de regroupement. Les types d'agrégats sont autorisés à avoir un constructeur par défaut, tant que c'est en défaut, où il est d'abord déclaré:
À partir de [dcl.init.aggr]/1:
Un agrégat est un tableau ou une classe (Clause [classe]), avec
- aucun utilisateur fourni par les constructeurs ([classe.ctor]) (y compris celles héritées ([espace de noms.udecl]) à partir d'une classe de base),
- aucune privés ou protégés non-membres de données statiques (Clause [classe.accès]),
- pas de fonctions virtuelles ([classe.virtuel]), et
- pas de virtuel, privé ou protégé des classes de base ([classe.mi]).
et à partir de [dcl.fct.def.par défaut]/5
Explicitement-par défaut les fonctions et implicitement-les fonctions déclarées sont collectivement appelés par défaut des fonctions, et la mise en œuvre doit fournir implicite de définitions ([classe.ctor] [classe.dtor], [classe.copie]), ce qui pourrait signifier les définir comme étant supprimés. Une fonction est fourni par l'utilisateur si elle est déclarée et non explicitement par défaut ou supprimé sur sa première déclaration. L'utilisateur fournies explicitement par défaut de la fonction (c'est à dire, explicitement fait défaut après sa première déclaration) est défini au point où il est explicitement fait défaut; si une telle fonction est implicitement défini comme étant supprimée, le programme est mal formé. [ Note: la déclaration d'une fonction par défaut après sa première déclaration peut fournir une exécution efficace et concise, tout en permettant une stabilité interface binaire à une évolution de la base de code. - la note de fin ]
Ainsi, nos exigences pour un total de:
- pas de non-publics des membres
- pas de fonctions virtuelles
- pas de virtuel ou non-public des classes de base
- aucun utilisateur fourni par les constructeurs hérités ou autrement, qui ne permet que des constructeurs qui sont:
- déclarée implicitement, ou
- explicitement déclarée et définie en tant que par défaut en même temps.
C
répond à toutes ces exigences.
Naturellement, vous pouvez peut-être débarrasser de ce faux par défaut de la construction de comportement en fournissant simplement un vide de constructeur par défaut, ou en définissant le constructeur par défaut après avoir déclaré:
class C {
C(){}
};
// --or--
class C {
C();
};
inline C::C() = default;