引用超出范围的变量
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。
我做了下面的例子来测试我对参考文献的理解:
#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。