Warum meckert mein Compil0r nicht?
-
Hi!
vector <string> v; const vector <string>& get_vector() { v.push_back("test"); return v; } void use_vector() { const vector <string>& a = get_vector(); vector <string> b = get_vector(); }Warum wird Zeile 11 nicht angemeckert? Die Funktion get_vector
liefert doch ne const-Referenz, aber Zeile 11 nimmt keine Referenz entgegen sondern kopiert das Objekt.
-
Ähm, weil in Zwile 11 keine Referenz zugewiesen sondern der Zuweisungsoperator augerufen wird. Und dieser ist ja bekanntermaßen mit ner constreferenz zufrieden.
-
Ja, warum solltest du es nicht kopieren dürfen? Der konstante vector wird dabei ja nicht verändert.
-
vect0r0r schrieb:
Ähm, weil in Zwile 11 [...] der Zuweisungsoperator augerufen wird.
Falsch. Setzen. 6.
-
Ok!
-
Achso, warum, ja weil ich dachte: das was als Type aus einer Funktion rauskommt, muss auch entgegen genommen werden. Aber wenn ich schon denke

-
vect0r schrieb:
Achso, warum, ja weil ich dachte: das was als Type aus einer Funktion rauskommt, muss auch entgegen genommen werden. Aber wenn ich schon denke

Es wird nicht der Zuweisungsoperator aufgerufen sondern der Kopierkonstruktor.
Grüssli

-
Dravere schrieb:
...
Es wird nicht der Zuweisungsoperator aufgerufen sondern der Kopierkonstruktor.Grüssli

Naja - die Kernaussage ist aber schon korrekt, dass die entgegennehmende "Funktion" (sei es nun operator=(), CopyCtor oder irgendetwas Anderes) das Objekt als "unveränderbar" (const-Ref., Kopie, ...)) entgegennimmt - und da der Compiler nichts gegen haben wird.
Wobei es doch eigentlich Probleme geben sollte, wenn der Kopierkonstruktor (was Gott verhindern möge) den übergebenen Parameter veränderte, oder?
std::vector ist natürlich nicht so "kaputt" definiert, aber Folgendes wäre ja schon denkbar:struct B { B(vector<string>& v); } B b = get_vector();... und da sollte der Compiler wohl doch was gegen haben, oder?
Gruß,
Simon2.