2012-05-10 81 views
5

此問題可以視爲對以下問題的後續處理:C++ temporary variable lifetimeC++ - 臨時變量及其生存期

Qt容器支持stream-like初始化語法。現在,當我編寫下面的代碼時,我的QVector在賦值之後立即被破壞,並且引用變得懸而未決。

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

通訊operator<<實現方式如下:

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

據我所知,10.4.10 Temporary Objects指出,臨時對象的壽命延長到correspnding const的壽命相匹配參考它。

但是,在這種情況下,臨時對象QVector<QString>()被破壞較早。

我想這可能是由於最後一個操作返回QVector<QString>&而不應該知道臨時QVector<QString>的生命週期的事實,但這種解釋並不嚴格,可能是錯誤的。

那麼,爲什麼會發生這種情況呢?

+3

「*我想這大概這是由於...... *「你大致正確,但技術解釋是,右值正在衰減爲左值。 – ildjarn

+0

我認爲,'temporary'綁定到* operator << *的* *參數,但在'expression'結尾被銷燬。該標準只保證'臨時'綁定到* const ref *的生命時間,而不是'綁定到他們的臨時參考'。 –

+0

我意識到你的問題可以滿足學術界的好奇心,但實際上,你可以讓'v'不是這樣的引用:'const QVector v = QVector ()<<「X」<<「Y」<<「 Z「;' –

回答

7

一個臨時的壽命,如果它被綁定到一個const引用僅用於擴展:

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

然而,在你的代碼是結合臨時到任何東西。相反,你正在調用(臨時)的成員函數,它返回一個引用(到臨時)。這個函數調用的結果不再是一個臨時對象,而只是一個簡單的引用。原始臨時對象在其出現的完整表達式的末尾到期,並且參考v變爲懸掛。

(在新的C++,有可能憑藉右值合格的成員函數來禁止這種「意外」,即你可以=delete<<操作的右值版本)。