关于 C++ 中“不能返回对象引用”的思考
C++的使用者或多或少都听说过这样一句话:函数返回值不能返回对象的引用。
这句话当然是错误的,如果函数返回值真的不能返回对象引用,那编译器直接把这种情况判定为编译错误就可以了。
那这句话究竟是哪里说错了?
我们可以先看看一下代码:
A& func(){
A a;
return a;
}
对象 a 是在函数栈上分配,当 func 函数调用完毕后,对象 a 就会被回收,此时如果把对象 a 的引用当作返回值,那将访问到被回收的内存而导致程序异常出错。
但是看看下面的代码:
A& A::operator=(A& a_){
this = &a_;
return *this;
}
上面的代码其实是合法的,因为*this 不是临时对象,即使离开了 operator=函数体,this 也不会被销毁。因此这种用法是被允许的。
因此,正确的说法应该是:函数返回值不能返回临时对象的引用,但是可以返回非临时对象的引用。
版权声明: 本文为 InfoQ 作者【她的男人是程序员】的原创文章。
原文链接:【http://xie.infoq.cn/article/514a45cd1c05be62f0bfb94a4】。文章转载请联系作者。
评论