Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 局部变量的返回引用问题_C++ - Fatal编程技术网

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;    
}