2012-05-10 13 views
5

この質問は、次の質問へのフォローアップと見なすことができます:C++ temporary variable lifetimeC++ - 一時変数とその寿命

Qtコンテナは、stream-like初期化構文をサポートします。今、次のコードを書くと、私のQVectorは代入の直後に破棄され、参照がぶら下がってしまいます。 、私の知る限りでは

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

10.4.10 Temporary Objectsは一時オブジェクトの寿命はcorrespnding constの寿命と一致するように拡張されていることを述べ、次のように実装されoperator<<対応

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

それを参照してください。

ただし、この場合、一時オブジェクトQVector<QString>()は先に破棄されます。

は、私はおそらくこれが原因最後の操作がQVector<QString>&を返し、一時的QVector<QString>の寿命については何も知らないはずですが、この説明は厳密ではなく、間違っているかもしれないという事実のために起こることを推測します。

これはどうしてですか?それはのconst参照にバインドされている場合は、一時の

+3

「*私はおそらく推測します*あなたはおおよそ正しいですが、技術的な説明は右辺値が左辺値に崩壊していることでしょう。 – ildjarn

+0

私は、 'temporary'は* operator << *の* returned *参照にバインドされていますが、' expression'の最後では破棄されると思います。標準では、一時的な参照のみではなく、const ref *のライフタイムにバインドされた 'temporary 'を保証しています。 –

+0

私はあなたの質問が学問的な好奇心を満たすことを実感しますが、実際には、このように 'v'を参照することはできません。' const QVector v = QVector ()<< "X" << "Y" << " Z "; ' –

答えて

7

寿命だけ延長されます。

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

はしかし、あなたのコードでは、あなたはないが何かに一時的に結合されています。むしろ、(暫定的な)メンバ関数を呼び出すと、(暫定的な)参照を返します。この関数呼び出しの結果は、もはや一時オブジェクトではなく、単純な参照です。元のテンポラリオブジェクトは、それが現れる完全な式の最後に期限切れとなり、参照vはダングリングになります。

(新しいC++では、あなたが<<演算子の右辺値のバージョンを=deleteことができ、つまり、右辺値修飾メンバ関数のおかげで、このような「事故」を禁止することができる。)

関連する問題