引用作为函数参数编译失败

king_water 2008-11-06 11:29:24

int a;

int fun ( void )
{
return a;
}

void fun2 ( int &x )
{
x++;
}

int main()
{
fun2(a); //ok
fun2(fun()); //failed

return 0;
}

a也是一个int,fun也是返回int,为什么不行呢
无论全局变量还是成员变量我试了都不行

改为

int &fun ( void )
{
return a;
}

就行了
但为什么上述不行,且要是成员变量还能这么写吗,以前看过好像要是返回成员变量的引用最好常引用,但那样我调用的时候就会有问题了
...全文
169 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
elephont9527 2008-11-06
  • 打赏
  • 举报
回复
汗。。。

我答的没分,9L引用我的答案有分。。。
lann64 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lann64 的回复:]
引用 14 楼 chaojiew 的回复:
引用 11 楼 lann64 的回复:
fun返回临时变量,c++把临时变量都看做是const的。
谁说的?

lippman说的。
[/Quote]
对不起,我记错了,是Meyers说的。effetive c++第二版条款15里有一段“注意临时值是一个const。这很重要,因为它可以防止传递到函数内的临时值被修改。否则,程序员就会很奇怪地发现,只有编译器产生的临时值可以修改而他们在函数调用时实际传进去的参数却不行。(关于这一点是有事实根据的,早期版本的c++允许这类的临时值可以被产生,传递,修改,结果很多程序员感到很奇怪)”
ylx1982 2008-11-06
  • 打赏
  • 举报
回复
luguo
lann64 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chaojiew 的回复:]
引用 11 楼 lann64 的回复:
fun返回临时变量,c++把临时变量都看做是const的。
谁说的?
[/Quote]
lippman说的。
chaojiew 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lann64 的回复:]
fun返回临时变量,c++把临时变量都看做是const的。
[/Quote]谁说的?
chaojiew 2008-11-06
  • 打赏
  • 举报
回复
偶觉得1楼说的很有道理。。至于他说返回值的话,没有在栈内分配内存,,为什么返回值会只存在寄存器中呢?
lann64 2008-11-06
  • 打赏
  • 举报
回复
改成:
void fun2 ( const int &x )
{
// x++;
}
就可以调用
fun2(fun());
lann64 2008-11-06
  • 打赏
  • 举报
回复
fun返回临时变量,c++把临时变量都看做是const的。
devil_zuiai 2008-11-06
  • 打赏
  • 举报
回复
int fun ( void )
{
return a;
}
由于返回的是int
所以返回之前调用int的构造函数,构造的值是a的值,
构造返回一个临时对象,由于不能引用临时对象,
所以编译不通过。
一般返回值用于赋值如下:
int b = fun();
b是通过fun函数返回的临时变量构造自己,构造完后fun函数
返回之前构造的临时变量就释放了。

如果返回int&的话就不调用int的构造
函数,直接返回a,由于a不是一个临时对象。所以成功。
luxiaoxun 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 elephont9527 的回复:]
int fun ( void )
{
return a;
}

返回的是一个临时变量,非左值,不能作为引用,其值为a

int &fun ( void )
{
return a;
}

返回引用,实际就是a本身,当然想干啥就干啥了
[/Quote]

恩 这才对
elephont9527 2008-11-06
  • 打赏
  • 举报
回复
int fun ( void )
{
return a;
}

返回的是一个临时变量,非左值,不能作为引用,其值为a

int &fun ( void )
{
return a;
}

返回引用,实际就是a本身,当然想干啥就干啥了

lsldd 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xhs_lh04 的回复:]
fun2(fun()); //failed
因为fun只是返回的一个值,而fun2传入的是参数是引用传递,等于传递的是变量的栈内偏移,而fun返回的值在寄存器eax中的内容,并没有在堆栈中分配,就更没有栈内偏移了,所以就错啦
[/Quote]
study
kkndciapp 2008-11-06
  • 打赏
  • 举报
回复
int fun ( void )
{
return a;//这里返回的是一个局部变量,只是做值的返回,出了这个函数体内存就被回收了,你再调用fun2来对其引用已经失去意义了,因为它已经不存在了
}
yyyapple 2008-11-06
  • 打赏
  • 举报
回复
int fun ( void )
{
return a;
}

返回的是左值,不能作为引用
killbug2004 2008-11-06
  • 打赏
  • 举报
回复
int 和int&不是一样的,一个是值一个是引用,fun 实现的是值传递而非地址传递
xhs_lh04 2008-11-06
  • 打赏
  • 举报
回复
而你第二个是返回的引用,也就是说返回的全局变量的栈内偏移(相对地址),把这个传入fun2当然就OK了
enrico 2008-11-06
  • 打赏
  • 举报
回复
可能编译器做了一些强制检查,不让你把某些局部变量赋给引用吧
xhs_lh04 2008-11-06
  • 打赏
  • 举报
回复
fun2(fun()); //failed
因为fun只是返回的一个值,而fun2传入的是参数是引用传递,等于传递的是变量的栈内偏移,而fun返回的值在寄存器eax中的内容,并没有在堆栈中分配,就更没有栈内偏移了,所以就错啦

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧