2012-05-10 35 views
5

此问题可以视为对以下问题的后续处理:C++ temporary variable lifetimeC++ - 临时变量及其生存期

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指出,临时对象的寿命延长到correspnding const的寿命相匹配参考它。

但是,在这种情况下,临时对象QVector<QString>()被破坏较早。

我想这可能是由于最后一个操作返回QVector<QString>&而不应该知道临时QVector<QString>的生命周期的事实,但这种解释并不严格,可能是错误的。

那么,为什么会发生这种情况呢?

+3

“*我想这大概这是由于...... *“你大致正确,但技术解释是,右值正在衰减为左值。 – ildjarn

+0

我认为,'temporary'绑定到* operator << *的* *参数,但在'expression'结尾被销毁。该标准只保证'临时'绑定到* const ref *的生命时间,而不是'绑定到他们的临时参考'。 –

+0

我意识到你的问题可以满足学术界的好奇心,但实际上,你可以让'v'不是这样的引用:'const QVector v = QVector ()<<“X”<<“Y”<<“ Z“;' –

回答

7

一个临时的寿命,如果它被绑定到一个const引用仅用于扩展:

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

然而,在你的代码是结合临时到任何东西。相反,你正在调用(临时)的成员函数,它返回一个引用(到临时)。这个函数调用的结果不再是一个临时对象,而只是一个简单的引用。原始临时对象在其出现的完整表达式的末尾到期,并且参考v变为悬挂。

(在新的C++,有可能凭借右值合格的成员函数来禁止这种“意外”,即你可以=delete<<操作的右值版本)。