C++ 局部变量的返回引用问题
可能重复:C++ 局部变量的返回引用问题,c++,C++,可能重复: 我碰巧发现这个代码返回5。这样写没关系,还是一定要避免 int& f() { int i = 5; return i; } int main(){ cout<<f()<<endl; } int&f(){ int i=5; 返回i; } int main(){ cout如果它起作用,它只是偶然发生的。这是未定义的行为,应该绝对避免 f返回的那一刻,对于i所在的内存发生了什么以及您尝试访问它时发生了什么
我碰巧发现这个代码返回5。这样写没关系,还是一定要避免
int& f() {
int i = 5;
return i;
}
int main(){
cout<<f()<<endl;
}
int&f(){
int i=5;
返回i;
}
int main(){
cout如果它起作用,它只是偶然发生的。这是未定义的行为,应该绝对避免
f返回的那一刻,对于i
所在的内存发生了什么以及您尝试访问它时发生了什么,不再有任何保证。编译器警告是正确的-您不能这样做。i
可能会在某个意外的时间被覆盖
或者
int f() { // don't return reference
int i = 5;
return i;
}
int main(){
cout<<f()<<endl;
}
int f(){//不返回引用
int i=5;
返回i;
}
int main(){
cout当函数“f()”返回时,堆栈内容将弹出,变量“i”的内存地址将不再有效。不应使用此代码。同意。+1.您可能还想看看这个:如果您正在修改一个by reference参数,那么返回引用似乎也很奇怪(第二个示例)。当然,我并不是说这是错的。@Steve:有时候这是应该做的。举个例子,他似乎想要一个引用和一个返回值。在int
的特殊情况下,耸耸肩,使用引用基本上是错误的。@Steve:当你超载operator@FredOverflow-看看有多少人真的讨厌流运营商。顺便说一句,我不是他们中的一员,但你必须承认——他们在不止一个方面绝对是一个特例。例如,他们也给旧运营商赋予了全新的含义——这不是日常实践中推荐的东西。实际上是这张海报的复制品,并与之相关这里有更多的问题。
int &f( int &i ) { // accept reference
// actually, in the case of modify-and-return like this,
// you should call by value and return by value without
// using any references. This is for illustration.
i = 5;
return i;
}
int main(){
int i
cout<<f(i)<<endl;
}