繁体   English   中英

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

[英]C++ - temporary variables and their lifetime

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

Qt容器支持stream-like初始化语法。 现在,当我编写以下代码时,我的QVector在分配后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声明10.4.10 Temporary Objects的生命周期被扩展以匹配对应的const引用的生命周期。

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

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

那么,为什么会这样呢?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM