2013-07-31 20 views
6

Es ist möglich, einen Vektor mit einem Iterator Bereich zu konstruieren, wie folgt aus:Baukonstruktion Behälter mit Initialisiererliste von Iteratoren

std::vector<std::string> vec(std::istream_iterator<std::string>{std::cin}, 
          std::istream_iterator<std::string>{}); 

Aber ich kann auch kompilieren und Ausführen von Code unter Verwendung von C++ 11 einheitliche Initialisierung Syntax (beachten Sie die Armschienen), wie folgt:

std::vector<std::string> vec{std::istream_iterator<std::string>{std::cin}, 
          std::istream_iterator<std::string>{}}; 

Was ist hier wirklich los?

Ich weiß, dass ein Konstruktor, der eine Initialisierungsliste nimmt, Vorrang vor anderen Bauformen erhält. Sollte der Compiler nicht zum Konstruktor auflösen, indem er eine Initialisierungsliste mit 2 Elementen von std::istream_iterator übernimmt? Dies sollte ein Fehler sein, da ein std::istream_iterator nicht in den Vektoren Werttyp std::string konvertiert werden kann, richtig?

+0

Kommt dies von http://stackoverflow.com/questions/17978410/how-do-you-know-when-an-input-stream-has-reated-the-last-word-in-a-line/17978633 # 17978633? : D – P0W

+0

@ P0W JA! :) Ich habe diese Syntax viele Male benutzt, aber es hat mich wundern, wenn Sie es als C++ 11 Initialisierungsliste und nicht einfach Uniform Initialization Armschienen beschrieben. – Snps

Antwort

5

Von §13.3.2/1 ([over.match.list])

Wenn Objekte von nicht-aggregierte Klassentyp T Liste initialisiert sind (8.5.4), Überlast Auflösung wählt die Konstruktor in zwei Phasen:

- Anfangs sind die Kandidaten Funktionen der Initialisierer-Liste Bauer (8.5.4) der Klasse T und die Argumentliste besteht aus die Initialisiererliste als ein einziges Argument.

- Wenn keine tragfähige Initialisierer-Liste Konstruktor gefunden wird, die Überladungsauflösung ist erneut durchgeführt, wobei die Kandidaten-Funktionen sind alle Konstruktoren der Klasse T und die Argumentliste besteht aus den Elemente der Initialisiererliste.

In Ihrem Fall die Initialisiererliste Konstruktor wird nicht lebensfähig angesehen (weil std::istream_iterator<std::string> nicht konvertierbar std::string ist), und die zweite Bedingung gilt. Dies führt dazu, dass der Konstruktor 2 Iteratoren zur Auswahl nimmt.

+0

Und da ist die Erklärung. Vielen Dank! :) – Snps

Verwandte Themen