问一个引用的问题!

时间:2021-08-07 20:17:09
int f(){
return 0;
}

int const & g(){
return f();
}

int main(int argc, char* argv[])
{

int k = g();

  return 0;
}
以上程序在vc6中编译会出现警告C4172,而且得到的k的值也是不正确的。这个比较好理解!
但是将g改为如下的样子:
int const & g(){
int const & p =f();
return p;
}
却没有报警告,得到的值也是正确的。请问这是为什么?两者有什么区别?谢谢

17 个解决方案

#1


膜拜一下楼主结贴率---------

#2


那时栈还没有被覆盖,很危险的操作。再调用一次就完蛋了。

#3


悬空?
另:楼主的结贴率。。。Csdn 太有才了。

#4


引用 2 楼 sinservice 的回复:
那时栈还没有被覆盖,很危险的操作。再调用一次就完蛋了。

那为什么第一种做法会立即出错?能不能详细讲一下两者的区别!谢谢!

#5


引用 4 楼 maoloverme1 的回复:
引用 2 楼 sinservice 的回复:
那时栈还没有被覆盖,很危险的操作。再调用一次就完蛋了。

那为什么第一种做法会立即出错?能不能详细讲一下两者的区别!谢谢!


完全是因为人品好。

#6


哈哈,牛

#7


编译器原因
试试vs2005以上的版本

完全跟人品有关系,你的代码没准什么时候就会出错

#8


都错了。

#9


无论怎么说你都是在返回一个临时变量的引用。 行为本身就是未定义的。

#10


返回引用的话,这个引用要在这个函数调用前存在,这是正确的使用方法
如果你把int类型换成一个类的话 很可能两种方法都不行了

#11


 returning reference to temporary

#12


学习下。。

#13


不要返回一个零时变量的引用

#14


指针即地址
引用即别名

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

#15


引用 1 楼 csuxiaowu 的回复:
膜拜一下楼主结贴率---------

我也膜拜下

#16


可以这样试试

typedef   int   (&g)(); 
int f(){
return 0;
}
g=f;




LZ:

int const & g(){
return f();
}

你这样做为何不干脆把引用符号去提这样做。
int g(){
return f();
}
利用间接调用,或者用函数指定实现

#17


谢谢大家的回答,大家回答的都非常有道理。但是我感到困惑的是,为什么第一种写法每次都是错误的,而第二种写法每次都是正确的?虽然这种问题,很多人都说情况随机,但是在某种特定的编译环境下,得到的结果给人的印象都是确定的。这两种写法在底层来说有没有什么区别?当然从汇编的角度肯定能说明问题,但是一者我的汇编很差,在者难道非要从汇编的角度才能把这个问题说清楚吗?很多C++高阶的书籍也都没有从汇编的角度来说C++的问题呀.比如说《深入C++面向对象模型》。再等待几天吧,没什么结果就结贴给分!

#1


膜拜一下楼主结贴率---------

#2


那时栈还没有被覆盖,很危险的操作。再调用一次就完蛋了。

#3


悬空?
另:楼主的结贴率。。。Csdn 太有才了。

#4


引用 2 楼 sinservice 的回复:
那时栈还没有被覆盖,很危险的操作。再调用一次就完蛋了。

那为什么第一种做法会立即出错?能不能详细讲一下两者的区别!谢谢!

#5


引用 4 楼 maoloverme1 的回复:
引用 2 楼 sinservice 的回复:
那时栈还没有被覆盖,很危险的操作。再调用一次就完蛋了。

那为什么第一种做法会立即出错?能不能详细讲一下两者的区别!谢谢!


完全是因为人品好。

#6


哈哈,牛

#7


编译器原因
试试vs2005以上的版本

完全跟人品有关系,你的代码没准什么时候就会出错

#8


都错了。

#9


无论怎么说你都是在返回一个临时变量的引用。 行为本身就是未定义的。

#10


返回引用的话,这个引用要在这个函数调用前存在,这是正确的使用方法
如果你把int类型换成一个类的话 很可能两种方法都不行了

#11


 returning reference to temporary

#12


学习下。。

#13


不要返回一个零时变量的引用

#14


指针即地址
引用即别名

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

#15


引用 1 楼 csuxiaowu 的回复:
膜拜一下楼主结贴率---------

我也膜拜下

#16


可以这样试试

typedef   int   (&g)(); 
int f(){
return 0;
}
g=f;




LZ:

int const & g(){
return f();
}

你这样做为何不干脆把引用符号去提这样做。
int g(){
return f();
}
利用间接调用,或者用函数指定实现

#17


谢谢大家的回答,大家回答的都非常有道理。但是我感到困惑的是,为什么第一种写法每次都是错误的,而第二种写法每次都是正确的?虽然这种问题,很多人都说情况随机,但是在某种特定的编译环境下,得到的结果给人的印象都是确定的。这两种写法在底层来说有没有什么区别?当然从汇编的角度肯定能说明问题,但是一者我的汇编很差,在者难道非要从汇编的角度才能把这个问题说清楚吗?很多C++高阶的书籍也都没有从汇编的角度来说C++的问题呀.比如说《深入C++面向对象模型》。再等待几天吧,没什么结果就结贴给分!