Kürzlich habe ich eine sehr einfache Klasse geschrieben.
%Vor% Zu meiner angenehmen Überraschung hat es richtig zusammengestellt und funktioniert. Kann mir bitte jemand erklären, wie der Compiler die verschachtelten starre Initialisierer für eine std::pair
ableiten konnte? Ich benutze MSVS 2013.
Sie übergeben eine braced-init-Liste , die selbst verschachtelte brace-init-list s enthält, an AddString
. Das Argument kann mit dem Parameter std::initializer_list<std::pair<const char*,int>>
übereinstimmen, wenn die innere brained-init-Liste in std::pair<const char*,int>
konvertiert werden kann.
Dieser Prozess der Überladungsauflösung erfolgt in zwei Schritten; Zuerst wird versucht, Konstruktoren von std::pair
, die ein std::initializer_list
-Argument verwenden, zu vergleichen. Da std::pair
keinen solchen Konstruktor hat, tritt der zweite Schritt auf, wo die anderen Konstruktoren von std::pair<const char*,int>
werden mit char const[2]
und int
als Argumente aufgelistet. Dies entspricht dem folgenden pair
-Konstruktor, da char const[2]
implizit in char const *
konvertiert werden kann und der Konstruktor selbst nicht explicit
ist.
Zitieren N3337 §13.3.1.7 / 1 [over.match.list]
Wenn Objekte des Nicht-Aggregat-Klassentyps
T
durch die Liste initialisiert werden (8.5.4), wählt die Überladungsauflösung den Konstruktor in zwei Phasen aus:
- Zu Beginn sind die Kandidatenfunktionen die Initialisierungslistenkonstruktoren (8.5.4) der KlasseT
und die Argumentliste besteht aus der Initialisierungsliste als einzelnes Argument.
- Wenn kein ausführbarer Initialisierungslistenkonstruktor gefunden wird, wird die Überladungsauflösung erneut ausgeführt, wobei die Kandidatenfunktionen alle Konstruktoren der KlasseT
sind und die Argumentliste aus den Elementen der Initialisierungsliste besteht .
Wenn die Initialisierungsliste keine Elemente enthält und
T
einen Standardkonstruktor hat, wird die erste Phase weggelassen. Wenn bei der Initialisierung der Kopieliste einexplicit
-Konstruktor ausgewählt wird, ist die Initialisierung nicht korrekt .
Tags und Links c++ c++11 initializer-list list-initialization type-deduction