6

这个问题可以被认为是以下问题的后续问题:C++ 临时变量生命周期

Qt容器支持stream-like初始化语法。现在,当我编写以下代码时, myQVector在赋值后立即被破坏,并且引用变得悬空。

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>() 会提前销毁。

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

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

4

1 回答 1

8

仅当绑定到 const-reference 时才会延长临时对象的生命周期:

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

但是,在您的代码中,您没有将临时绑定到任何东西。相反,您正在调用一个成员函数(临时的),它返回一个引用(对临时的)。这个函数调用的结果不再是一个临时对象,而只是一个普通的引用。原始临时对象在它出现的完整表达式结束时过期,并且引用v变得悬空。

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

于 2012-05-10T20:20:16.680 回答