2009-07-13 5 views
28

Je suis récemment tombé sur une classe bizarre qui avait d'apparence trois constructeurs:Mot-clé explicite sur le constructeur multi-arg?

class Class 
{ 
    public: 
     explicit Class(int); 

     Class(AnotherClass); 

     explicit Class(YetAnotherClass, AnotherClass); 

    // ... 
} 

Cela ne veut pas vraiment de sens pour moi - je pensais que le mot-clé explicite est de protéger la construction du compilateur choisi à partir d'un type étranger.

Est-ce autorisé? Si c'est le cas, qu'est-ce que ça veut dire?

+0

ce doublon a obtenu plus/meilleures réponses: [Pourquoi est explicitement autorisé pour les constructeurs par défaut et les constructeurs avec 2 ou plus de paramètres (non par défaut)?] (Https://stackoverflow.com/questions/4467142/why-is- explicit-allowed-for-default-constructors-et-constructors-with-2-or-more) –

Répondre

46

Dans C++ 11, les constructeurs multi-paramètres peuvent être convertis implicitement en avec initialisation de l'accolade.

Toutefois, avant C++ 11 explicit appliqué uniquement aux constructeurs à un seul argument. Pour les constructeurs à arguments multiples, il a été ignoré et had no effect.

+1

Merci pour votre clarification. Je dirais que GCC mettrait en garde pour une telle occasion. – LiraNuna

+26

Avec la mise en garde que si tous les paramètres multi-arg sauf un ont des valeurs par défaut alors il aura un effet – zebrabox

+20

Cela a changé avec C++ 11. Maintenant les constructeurs multi-paramètres peuvent être convertis implicitement avec l'initialisation de l'accolade. – Shane

Questions connexes