C++ lokales Objekt in std::vector

OP #5167842
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.