2009-07-13 19 views
28

ich auf einige seltsame aussehende Klasse kam vor kurzem die drei Konstrukteure hatten:Explizites Schlüsselwort für Konstruktor mit mehreren Argumenten?

class Class 
{ 
    public: 
     explicit Class(int); 

     Class(AnotherClass); 

     explicit Class(YetAnotherClass, AnotherClass); 

    // ... 
} 

Das ist wirklich nicht Sinn für mich - ich dachte, das explizite Schlüsselwort ist Compiler gewählte Konstruktion aus einer fremden Art zu schützen.

Ist das erlaubt? Wenn es so ist, was bedeutet es?

+0

Dieses Duplikat hat mehr/bessere Antworten erhalten: [Warum ist explizit für Standardkonstruktoren und Konstruktoren mit 2 oder mehr (nicht standardmäßigen) Parametern erlaubt?] (Https://stackoverflow.com/questions/4467142/whyis- explizit-erlaubt-für-Standard-Konstruktoren-und-Konstruktoren-mit-2-oder-mehr) –

Antwort

46

In C++ können 11 Multiparameterkonstruktoren implizit mit Klammerinitialisierung konvertiert werden.

Allerdings vor C++ 11 explicit nur auf Konstruktoren mit einem Argument angewendet. Für Konstruktoren mit mehreren Argumenten wurde es ignoriert und had no effect.

+1

Vielen Dank für die Klarstellung. Ich würde annehmen, dass GCC für solch eine Gelegenheit warnen würde. – LiraNuna

+26

Mit der Einschränkung, dass, wenn alle außer einem der Parameter mit mehreren Argumenten Standardwerte haben, es einen Effekt hat – zebrabox

+20

Dies hat sich mit C++ 11 geändert. Jetzt können Multiparameterkonstruktoren implizit mit geschweifter Initialisierung konvertiert werden. – Shane

Verwandte Themen