2017-12-08 5 views
0

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 ???

+0

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. –

Antwort

2

Im gleichen Umfang der gleichen Funktion, können Sie die Lebensdauer eines anonymen vorübergehend erweitern, indem sie auf eine const Referenzbindung; Zur Vermeidung von Zweifeln ist dieses Verhalten nicht transitiv über Funktionsaufrufe.

+0

Äh, besser, geben Sie ein Beispiel von dem, was Sie mit dem "betrachten' std :: reference_wrapper "meinen. Wie geschrieben klingt es so, als ob das lebenslange Erweiterung über Funktionsaufrufe hinweg geben kann. –

+0

@ Cheersandhth.-Alf: Könnte es einfach nur, aber jetzt scheint diese Antwort ein wenig zu kurz zu sein. Mal sehen, wie die Community reagiert. – Bathsheba

+0

Ich denke, es ist klarer zu sagen, dass Sie die Lebensdauer eines temporären nur verlängern können, wenn ein Verweis auf es im gleichen Umfang wie das temporäre verwendet wird. Dies hält das temporäre für die Dauer des Bereichs am Leben. Hier wird nicht im selben Umfang referenziert, somit wird nichts erweitert. –

Verwandte Themen