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

Yip*_*Yay 6 c++ variables qt destructor lifetime

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

Qt容器支持stream-like初始化语法.现在,当我编写下面的代码时,我QVector在分配后立即被破坏,引用变得晃来晃去.

const QVector<QString>& v = QVector<QString>() << "X" << "Y" << "Z";
Run Code Online (Sandbox Code Playgroud)

相应operator<<的实现方式如下:

inline QVector<T> &operator<< (const T &t)
{ append(t); return *this; }
Run Code Online (Sandbox Code Playgroud)

据我所知,10.4.10 Temporary Objects指出临时对象的生命周期被扩展以匹配对应的对应生命周期const.

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

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

那么,为什么会这样呢?

Ker*_* SB 8

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

const QVector<QString>& v = QVector<QString>();
Run Code Online (Sandbox Code Playgroud)

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

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