簡體   English   中英

C ++ - 臨時變量及其生命周期

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM