关于C++中的函数返回局部string的问题

函数返回局部变量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等基本类型也是一样的。

所以,请明确什么是返回局部变量引用

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值