Les constructeurs par défaut ne doivent pas nécessairement être dépourvus de paramètres ; ils doivent simplement être invocables sans arguments.
Cette condition est remplie par tout constructeur dont les arguments ont tous des valeurs par défaut.
[class.dtor/1]:
Un constructeur par défaut pour une classe X est un constructeur de la classe X pour lequel chaque paramètre qui n'est pas un paquet de paramètres de fonction a un argument par défaut (y compris le cas d'un constructeur sans paramètres). [..]
struct Foo
{
Foo(int a = 0);
Foo(std::string str = "");
};
Bien entendu, dans cet exemple, vous ne pouvez pas instancier une Foo
utiliser l'un ou l'autre sans fournir d'argument (l'appel serait ambigu). Mais Foo
est toujours utilisable, et ce sont toujours des "constructeurs par défaut". C'est simplement la façon dont la norme a décidé de classer les choses, dans le but de définir des règles. Cela n'affecte pas vraiment votre code ou votre programmation.
(En passant, je ne voulais pas vous distraire mais vous auriez dû explicit
sur les deux !)