When ist der Kopierkonstruktor für den Rückgabewert passiert

8

Ich habe die folgende Elementfunktion:

%Vor%

RAIIMutex ist eine Hilfsklasse, die einen Mutex erhält und im Konstruktor sperrt und im Destruktor freigibt.

m_person ist vom Typ Person (etwas sehr klein). Andere Funktionen in anderen Threads können dieses Mitglied ändern.

Ich möchte m_person nach Wert zurückgeben (eine Kopie zurückgeben) und natürlich möchte ich die Situation vermeiden, in der m_person in einem anderen Thread geändert wird, während sie in die Rückgabe kopiert wird, also habe ich die Sperre hinzugefügt .

Aber was passiert zuerst? Erstellt der Compiler zuerst eine Kopie von m_person oder ruft zuerst der Destruktor von myLock auf?

Theoretisch ist es einfach lösbar, indem man so etwas macht:

%Vor%

Aber ich bin daran interessiert, die Antwort auf meine Frage zu wissen.

Danke

    
OopsUser 06.06.2016, 13:42
quelle

2 Antworten

10

Die Kopierinitialisierung des zurückgegebenen Wertes wird vorher bearbeitet.

Aus dem Standard .6.3/3 The return statement [stmt.return] (Hervorhebung von mir)

  

Die Kopierinitialisierung der zurückgegebenen Entität wird vor der Sequenz sequenziert   Zerstörung von Provisorien am Ende des Ausdrucks   erstellt durch den Operanden der Rückkehr Aussage, die wiederum ist    vor der Zerstörung lokaler Variablen (6.6) des Blocks sequenziert   Einfügung der return-Anweisung .

    
songyuanyao 06.06.2016, 13:53
quelle
-1

Destruktoren lokaler Objekte werden nach 'der letzten Zeile Ihres Codes' aufgerufen. Hier ist ein relevantes Zitat aus Standard (3.7.3 / 3):

  

Wenn eine Variable mit automatischer Speicherdauer initialisiert ist oder a   Destruktor mit Nebenwirkungen, es soll nicht vor dem Ende zerstört werden   von seinem Block , noch sollte es als eine Optimierung beseitigt werden, selbst wenn es   scheint unbenutzt zu sein, außer dass ein Klassenobjekt oder seine Kopie / Verschiebung möglich ist   eliminiert werden, wie in 12.8 spezifiziert.

    
SergeyA 06.06.2016 13:48
quelle

Tags und Links