C ++ 0x Initialisierungsliste als Referenz übergeben

8

Ich habe versucht, C ++ 0x-Initialisiererliste als Argument für einen Konstruktoraufruf auf diese Weise zu verwenden:

%Vor%

mit dem Konstruktor

%Vor%

Mit diesem Konstruktor beschwerte sich der Compiler:

%Vor%

Wenn ich jedoch den Konstruktor in

geändert habe %Vor%

Alles hat wie erwartet funktioniert. Warum funktioniert der erste Konstruktor nicht? Ich dachte, der Vektor könnte an der Stelle des Konstruktoraufrufs konstruiert und als Referenz übergeben werden, aber offensichtlich gibt es ein Problem. Kann mir das jemand erklären?

Danke

Übrigens. Ich benutze g ++ Version 4.4.5

BEARBEITEN: Dank der richtigen Antworten unten habe ich auch warum kann ich das nicht tun .

    
Radim Vansa 10.06.2011, 10:16
quelle

6 Antworten

7

Sie können ein temporäres Objekt nicht an ein T& binden.

Sie können ein temporäres Objekt an T const& binden:

%Vor%

Aber ich würde die Gesundheit eines vector of char Zeigers in Frage stellen. Was ist los mit std::string ?

    
Lightness Races in Orbit 10.06.2011, 10:21
quelle
3

Temporary kann nicht an nicht-const Referenz gebunden werden, also tun Sie dies:

%Vor%     
Nawaz 10.06.2011 10:21
quelle
2

Die Initialisierungsliste ist ein roter Ton, denke ich. Sie versuchen, eine temporäre an eine nicht-const Referenz zu binden, was illegal ist. Versuchen Sie es mit einer const-Referenz.

%Vor%     
tokage 10.06.2011 10:21
quelle
1

std::vector<const char *> &foos ist die lvalue-Referenz. Sie versuchen, rvalue zu übergeben, das ist falsch. Sie können entweder rvalue reference std::vector<const char *> &&foos oder const reference const std::vector<const char *> &foos

verwenden     
pure cuteness 10.06.2011 10:24
quelle
0

Sie können keinen rvalue std::vector an eine nicht konstante lvalue-Referenz binden. Sie müssen eine Konstantenreferenz oder eine R-Wertreferenz verwenden.

    
Puppy 10.06.2011 10:21
quelle
0

Sie haben bereits Ihre Antwort, aber da Sie eine "Initialisierungsliste" im Titel haben, sollten Sie in Betracht ziehen, einen (C ++ 0x) Initialisierungslistenkonstruktor zu schreiben, z. so:

%Vor%

Dann bist du kein Aggregat mehr, aber du kannst es so aufbauen:

%Vor%

Sie geben sogar il als const-Referenz weiter, wenn Sie das bevorzugen.

    
Kerrek SB 13.06.2011 10:01
quelle

Tags und Links