2012-05-10 21 views
5

Questa domanda può essere considerato un follow-up alla seguente domanda: C++ temporary variable lifetime.C++ - variabili temporanee e la loro vita

Qt contenitori supportano la sintassi di inizializzazione stream-like. Ora, quando scrivo il seguente codice, il mio QVector viene distrutto subito dopo l'assegnazione e il riferimento diventa penzolante.

const QVector<QString>& v = QVector<QString>() << "X" << "Y" << "Z"; 

corrispondente operator<< è implementata in questo modo:

inline QVector<T> &operator<< (const T &t) 
{ append(t); return *this; } 

Per quanto ne so, 10.4.10 Temporary Objects afferma che la durata di un oggetto temporaneo è esteso a corrispondere alla durata del correspnding const riferimento ad esso.

Tuttavia, in questo caso l'oggetto temporaneo QVector<QString>()viene eliminato in precedenza.

Immagino che probabilmente questo accade a causa del fatto che l'ultima operazione restituisce un QVector<QString>& e non deve sapere nulla circa la durata della temporanea QVector<QString>, ma questa spiegazione non è rigorosa e potrebbe essere sbagliato.

Quindi, perché questo accade?

+3

"* Credo che, probabilmente, questo succede a causa di ... * "Sei grosso modo corretto, ma la spiegazione tecnica sarebbe che un valore di valore decadrebbe in un valore. – ildjarn

+0

Penso che il 'temporary' sia associato al riferimento * restituito * dell'operatore * * ma alla fine dell 'espressione' viene distrutto. Lo standard garantisce solo il 'temporaneo 'legato alla vita di * const ref *, non i' riferimenti temporanei 'ad essi associati. –

+0

Mi rendo conto che la tua domanda soddisfi curiosità accademica, ma in pratica, si può solo fare 'V non-a-di riferimento come questo: 'const QVector v = QVector () << "X" << "Y" <<" Z ";' –

risposta

7

La durata di una temporanea è valida solo se è associato ad un const riferimento:

const QVector<QString>& v = QVector<QString>(); 

Tuttavia, nel codice si è non vincolante la temporanea a qualsiasi cosa. Piuttosto, stai chiamando una funzione membro (temporanea), che restituisce un riferimento (al temporaneo). Il risultato di questa chiamata di funzione non è più un oggetto temporaneo, ma solo un semplice riferimento. L'oggetto temporaneo originale scade alla fine dell'espressione completa in cui appare e il riferimento v diventa pendente.

(Nel nuovo C++, è possibile vietare tali "incidenti" in virtù delle funzioni membro rvalue qualificato, per esempio, si potrebbe =delete la versione rvalue dell'operatore <<.)

Problemi correlati