C ++ - 临时变量及其生命周期

时间:2012-05-10 20:02:57

标签: c++ qt variables destructor lifetime

此问题可视为以下问题的后续问题:C++ temporary variable lifetime

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>&并且不应该知道临时QVector<QString>的生命周期这一事实,但这个解释并不严格,可能是错的。

那么,为什么会这样呢?

1 个答案:

答案 0 :(得分:8)

临时的生命周期只有在绑定到const-reference时才会扩展:

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

但是,在您的代码中,您将临时绑定到任何内容。相反,你正在调用一个成员函数(临时的),它返回一个引用(到临时)。此函数调用的结果不再是临时对象,而只是一个简单的引用。原始临时对象在其出现的完整表达式的末尾到期,引用v变为悬空。

(在新的C ++中,可以通过rvalue限定的成员函数禁止此类“事故”,即您可以=delete <<运算符的右值版本。)