函数返回局部变量string的时候能不能被引用?
前两天被同事突然问道这个问题,见到string一时糊涂了,最初学习C++的时候,就说不能引用局部变量,现在怎么糊涂了呢?呵呵
今天想了下,原来是被函数外表蒙蔽了,看个例子
std::string TestStringReference()
{
std::string strTest = "This is a test.";
return strTest;
}
int main()
{
std::string& strRefer = TestStringReference();
std::cout << "strRefer:" << strRefer << std::endl;
return 0;
}
这里的std::string& strRefer = TestStringReference();是正确的吗?
咋一看,这里不是引用了函数返回的局部对象吗? 适用课本的结论:不正确的!
经过测试,上面的用法没有任何问题,程序不会core,编译器也没有任何告警或错误,编译器绝对是没有问题的,肯定是自己的问题。
调试了下,发现TestStringReference函数在return前,都会调用string的构造函数,这里没有需要再构造的对象呀?!
想了一下,恍然大悟:是否引用局部对象(本例仅对基本类型和string,不包括指针类的),取决于函数的返回值,而不是赋值语句。
即这种函数定义才是返回局部对象的引用
std::string& TestStringReference()
{
std::string strTest = "This is a test.";
return strTest;
}
这样就不对了,编译器直接会告警:warning C4172: 返回局部变量或临时变量的地址
第一种定义的方法,实际上返回的不是局部变量,而是编译器新构造的临时对象,现在编译器都支持RVO(Return Value Optimization),会把这些临时对象,赋给需要新构造的对象上,无需再次构造。
这里的问题实际上是个概念混淆了,导致了不确定。把string换成int等基本类型也是一样的。
所以,请明确什么是返回局部变量引用!