std :: initializer_list Typ Abzug

8

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.

    
pebbleonthebeach 21.05.2015, 00:02
quelle

1 Antwort

9
%Vor%

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.

%Vor%

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 Klasse T 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 Klasse T 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 ein explicit -Konstruktor ausgewählt wird, ist die Initialisierung nicht korrekt .

    
Praetorian 21.05.2015 00:37
quelle