lo standard non è Per quanto posso dire, sono particolarmente esplicito in proposito:
Gli oggetti di durata di archiviazione automatica vengono distrutti come da 6.7 quando il blocco sono sono dichiarati in uscita. - 3.7.2
All'uscita da un ambito, distruttori (12.4) sono chiamati per tutta la durata automatica stoccaggio (3.7.2) (dal nome oggetti e provvisori) che sono dichiarate in tale ambito, in ordine inverso di la loro dichiarazione - 6.6
Un'istruzione di reso con un'espressione di tipo non vuoto può essere utilizzata solo nelle funzioni restituendo un valore; il valore dell'espressione viene restituito al chiamante della funzione . L'espressione viene convertita implicitamente nel tipo restituito della funzione in cui appare. Una dichiarazione di reso può comportare la costruzione e la copia di un oggetto temporaneo (12.2). - 6.6.3
Anche quando la creazione dell'oggetto temporaneo viene evitato (12,6), tutte le semantiche restrizioni devono essere rispettati come se l'oggetto temporaneo è stato creato. - 12.2
Ciò sembra confermare in generale quello che ha detto James: su return m_protVal;
, un temporaneo viene creato, e quindi distruttori di tutti gli oggetti che devono essere distrutte sono chiamati in ordine inverso della loro dichiarazione (in questo caso, solo il distruttore di lock
viene chiamato). Tuttavia, non sono del tutto sicuro di come interpretare la seguente:
oggetti temporanei vengono distrutti come ultimo passo nella valutazione del full-espressione (1.9) che (lessicalmente) contiene il punto in cui sono stati creati. - 12,2
A full-espressione è definito come "come espressione che non è una sottoespressione di un'altra espressione". Non so quale parte del return m_protVal
è l'espressione piena: Geordi dice che questo è un
decl'ion-ss → → decl'ion func-def → func-corpo → compound-stmt → stmt- ss → stmt → jump-stmt
mentre i
di per sé è un
decl'ion-ss → → decl'ion func-def → func-corpo → compound-stmt → stmt-ss → stmt → jump-stmt → ... → id-expr → non valido-id → ident
Ciò rende chiaro se il temporaneo può essere copiato e distrutti prima del resto dei distruttori essere chiamato: Direi che non possono, come return m_protVal;
provoca la fine del blocco da raggiungere, ma posso Non trovo nulla nello standard che possa confermare questo.
(D'altra parte, non vedo alcun caso in cui tale comportamento causerebbe qualsiasi rottura, nessuno dovrebbe avere un puntatore al temporaneo in modo da essere distrutto prima non è un problema, e se il temporaneo aveva un puntatore a una variabile locale, i problemi arrivano quando il temporaneo viene distrutto in seguito - non che scrivere un codice del genere sia comunque una buona idea.)
http://stackoverflow.com/questions/3856729/how-to -use-lock-guard-when-return-protected-data – NPE
Puoi eseguire il tuo programma di test passo dopo passo in un debugger (come 'gdb' su Linux) per scoprirlo. –
@BasileStarynkevitch Che non gli dirà nulla di ciò che è garantito dalla lingua. –