C++ lokales Objekt in std::vector

OP #5167842
Lesenswert?

Nabend,

ich habe folgenden Code:
1
void EventManager::addEvent(Event event)
2
{
3
   [...]
4
   // event_list ist ein std::vector<Event>
5
   event_list.push_back(event);
6
   [...]
7
}
Laut [1] ist push_back als 'void push_back(const T& value) definiert, 
bekommt also eine Referenz auf das Objekt übergeben.
Wenn dem so wäre, dann wäre die Referenz ungültig, sobald 
EventManager::addEvent verlassen wird.
Das ist allerdings nicht so, die Elemente des vectors sind nach wie vor 
gültig.

Warum?



[1]: http://de.cppreference.com/w/cpp/container/vector/push_back
#5168592
Lesenswert?

Torsten R. schrieb:
> Noch als Ergänzung: Wenn Du Referenzen speichern wolltest, müsste der
> Typ von event_list `std::vector< Event& >` sein. Referenzen lassen sich
> aber nicht in vectoren speichern, weil ihnen dazu wesentlich
> Eigenschaften fehlen (Zuweisbarkeit, etc.).

Eine Referenz ist zuweisbar. Sie ist im Prinzip einfach ein zusätzlicher 
Name für ein bestehendes Objekt. Dementsprechend wird alles, was ich mit 
der Referenz mache, auf das Objekt angewendet, auf das sie verweist. So 
kann man auch der Referenz etwas zuweisen, wenn die Klasse das nicht 
verbietet.
Allerdings kann man eine Referenz, wenn sie einmal erzeugt ist, nicht 
auf ein anderes Objekt verweisen lassen, als das, wofür sie erzeugt 
wurde.
#5168833
Lesenswert?

Torsten R. schrieb:
> Rolf M. schrieb:
>
>> Allerdings kann man eine Referenz, wenn sie einmal erzeugt ist, nicht
>> auf ein anderes Objekt verweisen lassen, als das, wofür sie erzeugt
>> wurde.
>
> Naja, so ziemlich der Semantik von "Referenz läßt sich nicht zuweisen"
> entspricht :-) (Im Gegensatz zu "referenziertes Objekt läßt sich
> zuweisen")

Da ist für mich schon ein großer Unterschied im Verständnis des Konzepts 
einer Referenz. Eine Referenz selbst ist kein Objekt (wie es z.B. ein 
Zeiger wäre), sondern wie gesagt nur ein weiterer Name für ein 
bestehendes Objekt. Oft wird eine Referenz aber als eine Art konstanter 
Zeiger gesehen, was so nicht wirklich zum Konzept von Referenzen, wie es 
in C++ vorgesehen ist, passt. Eine Zuweisung ist auch ganz problemlos 
möglich:
1
int a = 3;
2
int & b {a};
3
b = 5;
Man weist hier b (was das selbe ist wie a) einen neuen Wert zu.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren