Reputation: 22814
This question can be considered a follow-up to the following question: C++ temporary variable lifetime.
Qt
containers support the stream-like
initialization syntax. Now, when I write the following code, my QVector
is destructed right after assignment and the reference becomes dangling.
const QVector<QString>& v = QVector<QString>() << "X" << "Y" << "Z";
Corresponding operator<<
is implemented the following way:
inline QVector<T> &operator<< (const T &t)
{ append(t); return *this; }
As far as I know, 10.4.10 Temporary Objects
states that the lifetime of a temporary object is extended to match the lifetime of the correspnding const
reference to it.
However, in this case the temporary object QVector<QString>()
is destructed earlier.
I guess that probably this happens due to the fact that the last operation returns a QVector<QString>&
and shouldn't know anything about the lifetime of the temporary QVector<QString>
, but this explanation isn't strict and might be wrong.
So, why does this happen?
Upvotes: 6
Views: 508
Reputation: 477150
The lifetime of a temporary is only extended if it is bound to a const-reference:
const QVector<QString>& v = QVector<QString>();
However, in your code you are not binding the temporary to anything. Rather, you're calling a member function (of the temporary), which returns a reference (to the temporary). The result of this function call is no longer a temporary object, but just a plain reference. The original temporary object expires at the end of the full expression in which it appears, and the reference v
becomes dangling.
(In the new C++, it is possible to prohibit such "accidents" by virtue of rvalue-qualified member functions, i.e. you could =delete
the rvalue version of the <<
operator.)
Upvotes: 8