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 太有才了。
另:楼主的结贴率。。。Csdn 太有才了。
#4
那为什么第一种做法会立即出错?能不能详细讲一下两者的区别!谢谢!
#5
完全是因为人品好。
#6
哈哈,牛
#7
编译器原因
试试vs2005以上的版本
完全跟人品有关系,你的代码没准什么时候就会出错
试试vs2005以上的版本
完全跟人品有关系,你的代码没准什么时候就会出错
#8
都错了。
#9
无论怎么说你都是在返回一个临时变量的引用。 行为本身就是未定义的。
#10
返回引用的话,这个引用要在这个函数调用前存在,这是正确的使用方法
如果你把int类型换成一个类的话 很可能两种方法都不行了
如果你把int类型换成一个类的话 很可能两种方法都不行了
#11
returning reference to temporary
#12
学习下。。
#13
不要返回一个零时变量的引用
#14
指针即地址
引用即别名
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
引用即别名
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
#15
我也膜拜下
#16
可以这样试试
LZ:
int const & g(){
return f();
}
你这样做为何不干脆把引用符号去提这样做。
int g(){
return f();
}
利用间接调用,或者用函数指定实现
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 太有才了。
另:楼主的结贴率。。。Csdn 太有才了。
#4
那为什么第一种做法会立即出错?能不能详细讲一下两者的区别!谢谢!
#5
完全是因为人品好。
#6
哈哈,牛
#7
编译器原因
试试vs2005以上的版本
完全跟人品有关系,你的代码没准什么时候就会出错
试试vs2005以上的版本
完全跟人品有关系,你的代码没准什么时候就会出错
#8
都错了。
#9
无论怎么说你都是在返回一个临时变量的引用。 行为本身就是未定义的。
#10
返回引用的话,这个引用要在这个函数调用前存在,这是正确的使用方法
如果你把int类型换成一个类的话 很可能两种方法都不行了
如果你把int类型换成一个类的话 很可能两种方法都不行了
#11
returning reference to temporary
#12
学习下。。
#13
不要返回一个零时变量的引用
#14
指针即地址
引用即别名
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
引用即别名
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
#15
我也膜拜下
#16
可以这样试试
LZ:
int const & g(){
return f();
}
你这样做为何不干脆把引用符号去提这样做。
int g(){
return f();
}
利用间接调用,或者用函数指定实现
typedef int (&g)();
int f(){
return 0;
}
g=f;
LZ:
int const & g(){
return f();
}
你这样做为何不干脆把引用符号去提这样做。
int g(){
return f();
}
利用间接调用,或者用函数指定实现
#17
谢谢大家的回答,大家回答的都非常有道理。但是我感到困惑的是,为什么第一种写法每次都是错误的,而第二种写法每次都是正确的?虽然这种问题,很多人都说情况随机,但是在某种特定的编译环境下,得到的结果给人的印象都是确定的。这两种写法在底层来说有没有什么区别?当然从汇编的角度肯定能说明问题,但是一者我的汇编很差,在者难道非要从汇编的角度才能把这个问题说清楚吗?很多C++高阶的书籍也都没有从汇编的角度来说C++的问题呀.比如说《深入C++面向对象模型》。再等待几天吧,没什么结果就结贴给分!