6

この質問は、次の質問のフォローアップと見なすことができます:C++一時変数の有効期間

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、一時オブジェクトの存続期間は、それに対応する参照の存続期間と一致するように延長されると述べてconstいます。

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

QVector<QString>&これはおそらく、最後の操作がaを返し、一時的なものの存続期間について何も知らないはずであるという事実が原因であると思いますQVector<QString>が、この説明は厳密ではなく、間違っている可能性があります。

では、なぜこれが起こるのでしょうか?

4

1 に答える 1

8

一時的なものの有効期間は、const-referenceにバインドされている場合にのみ延長されます。

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

ただし、コードでは、一時的なものを何にもバインドしていません。むしろ、(一時的な)メンバー関数を呼び出しています。この関数は(一時的な)参照を返します。この関数呼び出しの結果は、一時オブジェクトではなく、単なる参照です。元の一時オブジェクトは、それが表示される完全な式の終わりで期限切れになり、参照vがぶら下がります。

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

于 2012-05-10T20:20:16.680 に答える