#include <iostream>
#include <string>
using namespace std;
const string& Func()
{
return "123";
}
int main()
{
string s = Func();
cout << s << endl;
return 0;
}
const 引用不是会提升临时变量的生命期吗? 为什么返回函数内的临时变量会报错了? 我对const引用的理解哪里错了吗?
#include <iostream>
#include <string>
using namespace std;
const string& Func(const string& s)
{
return s;
}
int main()
{
string s = Func("123");
cout << s << endl;
return 0;
}
但是这段代码就可以了。 Func函数参数绑定到一个临时变量,然后返回这个临时变量的const引用,就没有问题?
why?
因为前者,“123”是在Func函数的内部,也就是该函数的栈上,出了函数就没有了。
而后者“123”是在main函数的内部Func函数执行完了,控制流返回到了main函数还在。
const引用会提高临时变量的生命周期是指,临时变量的生命周期本来只是创建该临时变量的表达式,表达式结束后,被析构,const引用将其生命周期提升到该函数结束时(如果是全局const引用变量,那自然就是提升到整个程序的生命周期),函数结束被析构,而并不会将其生命周期提升到函数外部,函数结束时,也会被析构掉的。
const引用其实和右值引用差不多,都是都是将临时变量的生命周期从该表达式提升到函数。
补充一点参考资料
引自http://en.cppreference.com/w/cpp/language/reference_initialization
翻译一下前两段,尤其注意加粗的字:
无论何时一个绑定了一个临时变量或者一个临时变量的基类子对象的引用,临时变量的生命周期被扩展到与引用的生命周期相对应,除了一下几个例外:
一个在函数的return语句中对函数的返回值的临时绑定不会被延展:它会在return语句结束时立即被销毁。这种函数总是返回一个悬垂引用。