Initialisieren eines Vektorzeichens mit Zeichenfolgenliteralen

8

Was ist richtiges Verhalten für den folgenden Code?

%Vor%

Dies wird von Clang akzeptiert, aber nicht von GCC und VC++

Ist das kein undefiniertes Verhalten?

    
P0W 10.11.2014, 05:22
quelle

1 Antwort

10

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

    
P0W 10.11.2014, 05:51
quelle

Tags und Links