Konstante Refernezen auf temproäre Objekte
-
Hallo.
Ich las, dass konstante Referenzen, die mit temporaeren Objekten initialisiert werden voellig in Ordnung sind.
Allerdings habe ich ein Problem mit dem GNU C++ Compiler (Version 2.95-4, 3.0, 3.2.3 und 3.3), das offenbar durch die Verwendung eines temporaeren Objekts mit einer Referenz entsteht:
class A
{
string const &m_str;public:
A(string const &str)
: m_str(str) {
}// Elementfunktionen, die auf m_str zugreifen.
}string f()
{
string s = "foo";
return s;
}string g()
{
A a(f());// Hier sollte eine Elementfunktion von A auf m_str zugreifen. m_str scheint aber bereits zerstoert worden zu sein.
}Es scheint, als wuerde m_str direkt nach der Konstruktion auf etwas Ungueltiges "verweisen".
Wo ist der Haken?
Danke.
-
Hallo,
das unbenannte Objekt, welches von f() geliefert wird, wird an die Referenz str gebunden. Damit bestimmt *diese* Referenz die Lebensdauer des Objekts. Das Objekt lebt solange, wie *diese* Referenz. Also bis zur schließenden Klammer des Ctors.Da du nun aber m_str ebenfalls das erwähnte Objekt referenzieren lässt, hast du ein Problem. Das Objekt stirbt mit Ablauf des Konstruktors. Die Referenz m_str existiert aber viel länger. Sie referenziert nun aber ein nicht mehr existierendes Objekt. Du hast also eine "dangling reference" erzeugt.