[英]C++ - temporary variables and their lifetime
這個問題可以被認為是以下問題的后續問題: C ++臨時變量生命周期 。
Qt
容器支持stream-like
初始化語法。 現在,當我編寫以下代碼時,我的QVector
在分配后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
聲明10.4.10 Temporary Objects
的生命周期被擴展以匹配對應的const
引用的生命周期。
但是,在這種情況下,臨時對象QVector<QString>()
被破壞。
我想這可能是因為最后一個操作返回一個QVector<QString>&
並且不應該知道臨時QVector<QString>
的生命周期的QVector<QString>
,但這個解釋並不嚴格,可能是錯誤的。
那么,為什么會這樣呢?
臨時的生命周期只有在綁定到const-reference時才會擴展:
const QVector<QString>& v = QVector<QString>();
但是,在您的代碼中,您不會將臨時綁定到任何內容。 相反,你正在調用一個成員函數(臨時的),它返回一個引用(到臨時)。 此函數調用的結果不再是臨時對象,而只是一個簡單的引用。 原始臨時對象在其出現的完整表達式的末尾到期,並且引用v
變為懸空。
(在新的C ++中,可以通過rvalue限定的成員函數禁止此類“事故”,即您可以=delete
<<
運算符的rvalue版本。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.