即使知道由于以下剪辑而发生的事情,理解它是如何发生也会有所帮助.接下来是四个问题
鉴于:
int& foo()
{
int i = 1;
return i;
}
Run Code Online (Sandbox Code Playgroud)
并且知道在下面对名为i的本地的引用被解除引用到分配给intVal的temp并且本地i在foo()的末尾消失
int intVal = foo();
Run Code Online (Sandbox Code Playgroud)
第一个问题 - 在下面,表达式的右侧与上面相同,所以这是编译器看到左侧并且基于上下文知道不取消引用返回的引用的情况,而是用它初始化创建一个新的引用?
第二个问题 - 只有这一点使得本地i坚持在intRef在范围内?
int& intRef = foo();
Run Code Online (Sandbox Code Playgroud)
第三个问题 - bellow intPtr获取本地i的地址.那么,编译器是否使用赋值的上下文并决定不取消引用以在获取引用的地址之前获取值(而不是说获取包含去引用值的temp的地址)?
第四个问题 - 当intPtr在范围内时,本地i会不停?
int* intPtr = &foo();
Run Code Online (Sandbox Code Playgroud)
不,这些都不会延长局部变量的生命周期.C++中没有任何东西会产生这种效果.C++中的本地对象一直存在,直到它们被声明的范围结束,故事结束.
乍一看似乎遵循不同规则的唯一规则是:
int foo() {
return 42;
}
int main() {
const int& i = foo();
// here, `i` is a reference to the temporary that was returned from `foo`, and whose lifetime has been extended
}
Run Code Online (Sandbox Code Playgroud)
也就是说,const引用可以延长分配给它的临时生命周期.
但是这需要函数返回一个值,而不是一个引用,而被调用者将返回值绑定到一个const引用,这两个都没有在你的代码中完成.