2016-07-12 27 views
2

Wenn ich ein Setup habe, wo eine Funktion, ein Objekt Bar als ein Argument nimmt, geht das Objekt zu einer lokalen Klasse Foo und Foo verwendet die Bar in seinem destructor wie:Sind lokale Objekte garantiert vorübergehende Argumente zu überleben? (C++ 11)

class Foo { 
    public: 
     Foo(const Bar& bar) : bar_(bar) {} 
     ~Foo() { 
      bar_.DoSomething(); 
     } 
    private: 
     const Bar& bar_; 
}; 

void example_fn(const Bar& input_bar) { 
    Foo local_foo(input_bar); 
    // ... do stuff. 
    // When foo goes out of scope, its destructor is called, using input_bar. 
} 

Wenn example_fn mit einem temporären Bar input_bar aufgerufen wird, ist die lokale Variable Foo local_foo garantiert vor dem temporären Argument zerstört werden? Mit anderen Worten: Sind Argumente garantiert, um lokale Variablen zu überleben?

+0

'example_fn' kann nicht wirklich mit einem temporären aufgerufen werden, da veränderbare lvalue-Referenzen nicht an Provisorien binden. –

+0

"ist die lokale Variable Foo local_foo garantiert vor dem temporären Argument zerstört werden" - 'input_bar' Sie meinen? Es ist kein temporäres ... – WhiZTiM

+1

Soweit 'example_fn' betroffen ist, ist das Objekt, auf das von' input_bar' verwiesen wird, nicht temporär, also bin ich mir nicht sicher, was Sie fragen. Weiterhin wird 'bar bar' der Konstruktorparameter * von * input_bar' kopiert, so dass' input_bar' nach der Erstellung von 'local_foo' noch weniger wichtig wird. Kurz gesagt, Ihr Kommentar "Wenn' foo' den Gültigkeitsbereich verlässt, wird sein Destruktor mit 'input_bar' aufgerufen." ist nicht wahr. – WhozCraig

Antwort

7

ist die lokale Variable Foo local_foo garantiert vor dem temporären Argument zerstört werden?

Ja, Objekte mit automatischer Speicherdauer (auch bekannt als Einheimische) werden garantiert in umgekehrter Reihenfolge der Konstruktion zerstört. Die Funktionsargumente werden immer (in einer nicht angegebenen Reihenfolge) vor den Locals innerhalb des Blockbereichs erstellt. Siehe Object Destruction in C++

[class.temporary/5]

5: ... Darüber hinaus verpflichten die Zerstörung von Provisorien zu Referenzen wird die Reihenfolge der Zerstörung von Objekten mit statisch, Gewinden berücksichtigen, oder die automatischen Speicherdauer ([ basic.stc.static], [basic.stc.thread], [basic.stc.auto]); das heißt, wenn obj1 ein Objekt mit der gleichen Speicherdauer wie das temporäre ist und erstellt wird, bevor das temporäre erstellt wird das temporäre zerstört werden, bevor obj1 zerstört wird; wenn obj2 ist ein Objekt mit der gleichen Speicherdauer wie das temporäre und erstellt nach dem temporären erstellt wird das temporäre zerstört werden, nachdem obj2 zerstört wird. ...

+0

@Yakk, behoben. Vielen Dank! – WhiZTiM