2016-07-13 24 views
8

Ich frage mich, was der Standard über das folgende Stück Code sagt. Kann string Destruktor des temporären Objekts vor dem Aufruf printPointer ausgeführt werden?Implizite Destruktorausführung in Funktionsaufruf

p.s. Der VS2010-Compiler beschwert sich nicht über diesen Code und funktioniert ordnungsgemäß.

void printPointer(const string* pointer) 
{ 
    cout << *pointer << endl; 
} 

const string* func(const string& s1) 
{ 
    return &s1; 
} 

int main() 
{ 
    printPointer(func("Hello, World!!!")); 
} 
+4

Die temporäre Zeichenfolge wird zerstört erst am Ende der Anweisung. Jemand kann wahrscheinlich die Referenz ausgraben (etwas mit Sequenzpunkten?), Aber Sie können es selbst sehen: http://ideone.com/N3Brll – CompuChip

Antwort

9

Kann string destructor von temporärem Objekt vor printPointer Aufruf ausgeführt werden? No

, weil temporäre Objekte werden bei der Bewertung des Voll Ausdrucks als letzten Schritt zerstört werden, die den Punkt enthält, in dem sie erstellt wurden, das heißt, es wird bis zum Aufruf von printPointer() Enden bestehen bleiben.

Vom Standard #12.2/4 Temporary objects [class.temporary]:

Temporäre Objekte als letzter Schritt zerstört werden, um den vollen Ausdruck in der Bewertung ([intro.execution]), dass (lexikalisch) enthält den Punkt, an dem sie erstellt wurden.

Und #12.2/6 Temporary objects [class.temporary]:

ein temporäres Objekt auf einen Referenzparameter in einem Funktionsaufruf gebunden ([expr.call]) bleibt bestehen, bis die Vollendung des vollen Ausdrucks den Anruf enthält.

explanatory demo

-6

Ihre Zeichenfolge nicht bis zum Ende des Programms zerstört wird, wie s1 ein Hinweis darauf ist (so, es ist nicht in func zerstört wird). In Func gibt es keinen Pass-by-Value oder Return-by-Value. Kein Problem in diesem Code.

+4

Seine Zeichenkette wird nach dem 'printPointer' Anruf zerstört. Nur weil es einen Hinweis darauf gibt, heißt das nicht, dass es nicht zerstört wird. –

+0

Ersetzen Sie 'printPointer (func (" Hallo, Welt !!! ")) durch Ihre Logik;' durch 'string * s = func (" Hallo, Welt !!! "); printPointer (s); 'sollte auch gültig sein? – CompuChip