Nachdem ich ein wenig in Standards gegraben habe, fand ich folgendes:
Hier versuche ich, vector<char>
mit zwei String-Literalen zu initialisieren, nicht mit zwei Zeichen.
mit vector(initializer_list<T>)
. In diesem Fall vector(initializer_list<char>)
.
Der Typ eines Zeichenfolgenliterals ist jedoch "Array von n const char" , daher ist der Initialisierungslistenkonstruktor keine Übereinstimmung.
Dies bewirkt nicht einen Compilerfehler, da der Compiler einen anderen Konstruktor finden kann, der mit
übereinstimmt§13.3.1.7¶1 erklärt die Regeln:
"Wenn Objekte von Nicht-Aggregat-Klassentyp T werden in der Liste initialisiert, Überladungsauflösung wählt den Konstruktor in zwei Phasen aus:
- Zunächst der Kandidat Funktionen sind die Initialisierungslistenkonstruktoren der Klasse T und der Die Argumentliste besteht aus der Initialisierungsliste als einzelnes Argument [die wir gesehen haben, stimmte nicht überein].
- Wenn keine brauchbare Initialisierungsliste vorhanden ist Konstruktor gefunden, Überladungsauflösung wird erneut durchgeführt, wobei Die Kandidatenfunktionen sind alle Konstruktoren der Klasse T und Die Argumentliste besteht aus den Elementen der Initialisierungsliste. "
Und das Spiel ist in diesem Fall:
%Vor% Der Typ von InputIterator
hat keine Informationen von T
in vector<T>
.
Also, auch wenn ich ein vector<char>
initialisiere, können die beiden Argumente vom beliebigen Typ sein.
Die einzige Voraussetzung ist, dass sie bei InputIterator
property bleiben, was const char[]
passiert.
Der Konstruktor glaubt, dass zwei Iteratoren in derselben Sequenz übergeben wurden.
aber es wurde tatsächlich Iteratoren zu zwei völlig verschiedenen Sequenzen übergeben, "y"
und "z"
.
Das Ergebnis dieses Programms ist also undefined .
Danke an Chris Kommentar Das ist genau der gleiche Beitrag, den er dort erwähnt hat. Siehe das