2014-12-25 10 views
5

Ich habe vor kurzem über die explicit Spezifizierer erfahren.Wann sollte der explizite Spezifizierer für Konstruktoren mit mehreren Argumenten verwendet werden?

Angenommen, wir haben:

f(W, W, W); 

Wenn wir nun

f(42, 3.14, "seven"); 

Der Compiler tun die folgenden impliziten Konvertierungen versuchen:

f(W(42), W(3.14), W("seven")); 

Wenn wir passende Konstrukteuren für W definiert haben , nämlich:

W(int); 
W(double); 
W(std::string); 

... wird es gelingen.

Wenn wir jedoch die ersten explizit zu machen:

explicit W(int); 

... dies deaktiviert die implizite Konvertierung.

Sie müssten jetzt schreiben:

f(W(42), 3.14, "seven"); 

dh es Sie zwingt ausdrücklich die Umwandlung zu erklären

Nun zu der Frage:

Es ist möglich, zu schreiben:

explicit W(int,int); // 2 arguments! 

Th ist kompiliert!

Aber ich kann kein entsprechendes Szenario sehen, das diese Syntax erfordern könnte.

Kann jemand ein minimales Beispiel zur Verfügung stellen?

+2

Ein Teil davon könnte nur aus Gründen der Konsistenz sein, da Multiparameterfunktionen auch Standardwerte haben können, z. explizite W (int, int = 0); '. – Rufflewind

Antwort

10

Wenn Ihr Konstruktor explizit ist und die Klasse keinen nicht expliziten Konstruktor liefert, der initializer_list<T> übernimmt, dann können Sie eine Instanz nicht kopieren-list-initialisieren.

W w = {1,2}; // compiles without explicit, but not with 

Simple live example

Zitate von Standard:

8,5/16

- Wenn der Initialisierer eine (nicht eingeklammerten) verspannt-init-Liste, die Objekt oder Referenz wird in der Liste initialisiert (8.5.4).

8.5.4/3

List-Initialisierung eines Objekts oder einer Referenz des Typs T ist definiert als folgt: ...

Andernfalls, wenn T ein Klassentyp ist, werden Konstruktoren berücksichtigt. Die anwendbaren Konstruktoren werden aufgelistet und die beste wird durch Überladungsauflösung gewählt (13.3, 13.3.1.7). Wenn eine konvertierende Konvertierung (siehe unten) erforderlich ist, um eines der Argumente zu konvertieren, ist das Programm schlecht formatiert.

+0

Umformulierung meines vorherigen Kommentars: vielleicht macht die Erwähnung von 'initializer_list' die Antwort verwirrend. Aber ich denke, es ist richtig. – juanchopanza

+1

FGITW und all das. –

+0

Wenn Sie "impliziter Konstruktor" sagen, meinen Sie "Konstruktor nicht mit dem expliziten Schlüsselwort deklariert", und das macht Sinn, aber wenn ich es lese, denke ich an implizit generierte Konstruktoren, die vom Benutzer nicht deklariert werden. (In Ihrem Beispiel, 'A's Kopierkonstruktor, zum Beispiel.) Ich weiß nicht, ob" impliziter Konstruktor "ein allgemein akzeptierter Begriff ist, so wie Sie ihn benutzen, aber ich habe ihn noch nie zuvor gesehen . – hvd

Verwandte Themen