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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.