使用函数返回引用变量
记录一下在工作中遇到的坑。
当函数返回引用变量会发生什么?先看代码:
int rtnValue1()
{
int a = 1;
return a;
}
int& rtnValue2()
{
int a = 2;
return a;
}
int main()
{
int a1 = rtnValue1();
int& a2 = rtnValue2();
std::cout << a1 << " " << a2 << endl;
}
是不是代码没问题?? a2的值是多少?等于2吗???
然而打印结果显示a2的值不等于2。为什么?
因为rtnValue2函数返回的值是局部变量,而引用类型并不会重新分配存储单元,而是相当于给这个临时变量起了个别名,在函数执行完后,局部变量所占的内存被回,所以a2的值会改变。
看下面代码
int rtnValue1()
{
int a = 1;
std::cout <<"rtnValue1 "<< & a << " " << a << endl;
return a;
}
int& rtnValue2()
{
int a = 2;
std::cout << "rtnValue2 " << &a << " " << a << endl;
return a;
}
int main()
{
int a1 = rtnValue1();
int& a2 = rtnValue2();
int&& a3 = rtnValue1();
std::cout << &a1 <<" " << a1 << endl;
std::cout << &a2 << " " << a2 << endl;
std::cout << &a3 << " " << a3 << endl;
}
结果如下:
rtnValue1 0113FBE8 1
rtnValue2 0113FBE8 2
rtnValue1 0113FBE8 1
0113FCFC 1
0113FBE8 1524406664
0113FCD8 1
a2的地址是临时变量的地址,会被程序其他地方使用。那么a3是个什么东西?
右值引用
在C++中,常量、变量或表达式一定是左值(lvalue)或右值(rvalue)
左值:非临时的(具名的,可在多条语句中使用,可以被取地址)。可以出现在等号的左边或右边。可分为非常量左值和常量左值。
右值:临时的(不具名的,只在当前语句中有效,不能取地址)。只能出现在等号的右边。可分为非常量右值和常量右值。
左值引用:对左值的引用就是左值引用。可分为非常量左值引用和常量左值引用。 例如int & a = b;
右值引用(Rvalue References):对右值的引用就是右值引用。可分为非常量右值引用和常量右值引用。例如int && a = b;为临时对象的右值,它的生命周期很短暂,一般在执行完当前这条表达式之后,就释放了。
通过将其赋值给右值引用,可以在不进行昂贵的拷贝操作的情况下被“续命”,让其生命周期与右值引用类型变量的生命周期一样长。
下面的文章总结的很好,记录一下
https://blog.youkuaiyun.com/vc43vc/article/details/82927854