Kürzlich habe ich in einem Projekt auf ein Problem gestoßen. Der Code dort ist viel komplizierter als das folgende Beispiel, aber ich hoffe, dass das Problem (wenn es eins gibt) dasselbe ist.C++ Speichern einer Konst & zu einem Temporären
#include <iostream>
class mObject
{
public:
mObject(){ std::cout << "mObject ctor\n"; }
mObject(const mObject& other){ std::cout << "mObject copy ctor\n"; }
~mObject(){ std::cout << "mObject dtor\n"; }
};
struct cFoo{
cFoo(const mObject& obj):obj_(obj){}
const mObject& get() { return obj_;}
const mObject& obj_;
};
mObject giveme() { return mObject(); }
void func2(const mObject& p) { mObject g = p; }
int main()
{
cFoo k(giveme());
func2(k.get());
return 0;
}
Das gibt mir den folgenden Code:
mObject ctor
mObject dtor
mObject copy ctor
mObject dtor
So ist die ursprüngliche "vorübergehend" mObject
Instanz stirbt, bevor func2
usese es. Ich dachte, dass die Lebenszeit eines temporären object
verlängert wird, wenn es einen const&
dazu gibt. Das Zuweisen der Rückgabe von giveme()
zu einem lokalen const&
in Funktion main
löst dieses Problem. Dann lebt das vorläufige Ende bis zum Ende des Geltungsbereichs der main
. Also, was ist hier los ???
Lebensdauerverlängerung ist für eine temporäre (oder einen Teil einer temporären) Bindung an eine lokale Referenz. In diesem Fall kann der Compiler das Temporäre einfach als lokale Variable behandeln. Das ist nicht möglich, wenn in Funktionsaufrufen eine Referenz übergeben wird. –