引用超出范围的变量

Reference to variable out-of-scope

我做了下面的例子来测试我对参考文献的理解:

#include <iostream>

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

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

我打算做的是写一个销毁引用变量的例子。我最初写这篇文章的想法是,由于 test 中的 a 的生命周期在 test 中 returning b 时结束,因此输出 return- test 的值会产生乱码。然而,令我大吃一惊的是,它确实输出了 1!

这怎么可能?我在这里错过了什么 - a 可以继续住在 b 吗?

函数不return引用任何对象。它 return 是 int 类型的临时对象,由 b 引用的值 copy-initialized

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

其实这个函数在没有使用中间变量的情况下相当于下面的函数

int test(){
    return 1;
}

给return一个引用意味着函数return类型应该是一个引用类型。像

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

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

我知道你的困惑是从哪里来的。你认为因为你在 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;
}

在这种情况下,你是 return b 而没有 de-referencing 变量,那么你将获得内存地址而不是数字 1。