将函数的局部变量返回给常引用类型,编译运行没有问题,输出也是正确的。这个常引用指向的对象在什么地方。
#include <iostream> using namespace std; int func() { int a = 10; return a; } int main() { int const& a = func(); cout << a << endl; return 0; }
闭关修行中......
1,不考虑 copy ellison 的情况下,const int& a 指向的不是 func 里面的 a, 而是 func 里面a的拷贝(因为 func 返回值是int 而非 int&)。2, local const & 会延长 func() 所产生的临时对象(pure rvalue)的生命周期,直至这个const & 生命周期结束。所以不会有任何问题。
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。你可以采用VS或者IDA,windbg等工具进行反汇编调试,过程一清二楚。上面这个就是直接把10赋值给了main中的a变量。
通过C++常量引用从函数返回一个局部对象:
一般从一个函数返回一个局部对象的引用是不对的:
int & fun ( void ) { int t = 3; return t; }
特殊情况:返回一个常引用
const int & fun ( void ) { int t = 3; return t; } const int & my_t = fun ();
在这个情况下,局部变量 t 不会被直接析构,而是会保留到 my_t 的生命周期结束为止。
总之,C++常量引用语法上可以引用一个临时变量。这种方法在使用引用作函数参数和返回局部变量时有意义。我目前看来常量引用主要用在作函数参数或保证不修改原变量的时候。
关于引用的初始化有两点值得注意:
(1)当初始化值是一个左值(可以取得地址)时,没有任何问题;
(2)当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:
首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量。在这种情况下,const T&(常量引用)过程中使用的临时对象会和const T&(常量引用)共存亡。
链接描述
1,不考虑 copy ellison 的情况下,const int& a 指向的不是 func 里面的 a, 而是 func 里面a的拷贝(因为 func 返回值是int 而非 int&)。
2, local const & 会延长 func() 所产生的临时对象(pure rvalue)的生命周期,直至这个const & 生命周期结束。
所以不会有任何问题。
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。
你可以采用VS或者IDA,windbg等工具进行反汇编调试,过程一清二楚。
上面这个就是直接把10赋值给了main中的a变量。
通过C++常量引用从函数返回一个局部对象:
一般从一个函数返回一个局部对象的引用是不对的:
特殊情况:返回一个常引用
在这个情况下,局部变量 t 不会被直接析构,而是会保留到 my_t 的生命周期结束为止。
总之,C++常量引用语法上可以引用一个临时变量。这种方法在使用引用作函数参数和返回局部变量时有意义。我目前看来常量引用主要用在作函数参数或保证不修改原变量的时候。
关于引用的初始化有两点值得注意:
(1)当初始化值是一个左值(可以取得地址)时,没有任何问题;
(2)当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:
首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量。在这种情况下,const T&(常量引用)过程中使用的临时对象会和const T&(常量引用)共存亡。
链接描述