引用变量范围外的

问题描述

我制作了以下示例,以测试我对引用的理解:

#include <iostream>

int test(){
    int a = 1;
    int &b = a;
    return b;
}

int main(int argc,const char * argv[]) {
   
    std::cout << test() << std::endl;
}

我打算做的是写一个引用变量被销毁的示例。我最初的想法是,由于atest的生命周期在b中返回test时结束,因此输出test的返回值会产生乱码。但是,令我惊讶的是,它实际上确实输出了1!

这怎么可能?我在这里想念的是-a可以继续生活在b中吗?

解决方法

该函数不返回对任何对象的引用。它返回一个类型为int的临时对象,该对象已由b引用的值进行了复制初始化。

int test(){
    int a = 1;
    int &b = a;
    return b;
}

实际上,该函数等效于以下函数,而无需使用中间变量

int test(){
    return 1;
}

返回引用意味着函数返回类型应为引用类型。像

int & test()
{
    int a = 1;
    return a;
}

在这种情况下,编译器将发出一条消息,指出函数返回对局部变量的引用。

,

我知道你的困惑来自哪里。您认为是因为在分配b时使用(&)运算符,所以变量b现在包含a的内存地址。情况并非如此,“&”号是静音的,这意味着在这种情况下它对变量b没有影响。

int test()
{
int a = 1;
int &b = a;
return b;
}

您期望的行为看起来像这样

int* test()
{
int a = 1;
int *b = nullptr;
b = &a; 
return b;
}

在这种情况下,您返回b而不取消引用变量,那么您将获得内存地址而不是数字1。