此问题可视为以下问题的后续问题: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>
的生命周期这一事实,但这个解释并不严格,可能是错的。
那么,为什么会这样呢?
答案 0 :(得分:8)
临时的生命周期只有在绑定到const-reference时才会扩展:
const QVector<QString>& v = QVector<QString>();
但是,在您的代码中,您不将临时绑定到任何内容。相反,你正在调用一个成员函数(临时的),它返回一个引用(到临时)。此函数调用的结果不再是临时对象,而只是一个简单的引用。原始临时对象在其出现的完整表达式的末尾到期,引用v
变为悬空。
(在新的C ++中,可以通过rvalue限定的成员函数禁止此类“事故”,即您可以=delete
<<
运算符的右值版本。)