Implizite Destruktorausführung in Funktionsaufruf

8

Ich frage mich, was der Standard über den folgenden Code sagt. Kann string Destruktor des temporären Objekts vor dem Aufruf von printPointer ausgeführt werden?

ps. Der VS2010-Compiler beklagt sich nicht über diesen Code und funktioniert korrekt.

%Vor%     
skap 13.07.2016, 07:41
quelle

2 Antworten

9
  

Kann string Destruktor des temporären Objekts vor dem Aufruf von printPointer ?

ausgeführt werden?

Nein, weil temporäre Objekte als letzter Schritt bei der Auswertung des Full-Expressions zerstört werden, der den Punkt enthält, an dem sie erstellt wurden, was bedeutet, dass er bis zum Aufrufen von printPointer() bestehen bleibt .

Von den Standard # 12.2 / 4 Temporären Objekten [class.temporary] :

  

Temporäre Objekte werden als letzter Schritt bei der Auswertung des vollständigen Ausdrucks ([intro.execution]) gelöscht, der (lexikalisch) den Punkt enthält, an dem sie erstellt wurden.

Und # 12.2 / 6 Temporäre Objekte [class.temporary] :

  

Ein temporäres Objekt, das an einen Referenzparameter in einem Funktionsaufruf ([expr.call]) gebunden ist, bleibt bis zum Abschluss des vollständigen Ausdrucks bestehen, der den Aufruf enthält.

Erklärungsdemo

    
songyuanyao 13.07.2016, 08:01
quelle
-6

Ihre Zeichenfolge wird erst am Ende des Programms zerstört, da s1 eine Referenz darauf ist (also nicht in func zerstört wird). In Func gibt es keinen Wertnachweis oder Rückgabewert. Kein Problem in diesem Code.

    
AhmadWabbi 13.07.2016 07:46
quelle