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?
"* 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
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. –
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 ";' –