关于<>中的一个问题

hyqryq 2001-04-11 12:06:00
中文版中P132:

class X{}
X f(){return X();}

void g1(X&){}
void g2(const X&){}

main()
{
g1(f()); //error
g2(f()); //OK
}

可是这个程序我在VC60下可以编译通过,书上说由于f()这个临时变量是常量,可是
在p130页的程序中 f5()=X(1)可以运行,这是怎么回事?

...全文
129 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyqryq 2001-04-14
  • 打赏
  • 举报
回复
ok!
hyqryq 2001-04-14
  • 打赏
  • 举报
回复
KAO,为什么不能结贴呢?
lu_yb 2001-04-11
  • 打赏
  • 举报
回复
因为f()返回的是一个值,而不是一个变量,你要当它
做变量用,就只好产生一个临时变量。
从最终编译出的东西来说,一个函数在最后把它的返回
值压入堆栈:
push blabla
...
在调用它的地方从堆栈中弹出这个值
pop albalb
...
值是放在栈里的,而且是上一个局部空间的产物,只做
传递而用,你只能通过pop出它来得到值,然后它就不在
堆栈里了。如果你硬要直接当它做变量用,就只能得到它的
存放位置而不pop它(实际上不可能编译成这样),但这样
就会造成下一个/一组pop的错误。push和pop必须是成对
的。所以你要当它做一个变量用,只能产生一个临时变量
,把这个值放进去。而这个临时变量是个常量。
至于临时变量为什么要是常量,也是从error free的角度去
考虑的。就好象有人老想不通literal的东西为什么一定得
是常量。这些都是无数老程序员换来的经验吧。我只能
说出这么多了。
hyqryq 2001-04-11
  • 打赏
  • 举报
回复
谢谢lu_yb(piggy)的回答;

那么我想问"而要把它作为引用传递给其它函数时会
建立一个临时变量,这个临时变量是一个常量。",为什么要这样呢?
lu_yb 2001-04-11
  • 打赏
  • 举报
回复
在g1(f())中,f()返回的并不是常量,而要把它作为引用传递给其它函数时会
建立一个临时变量,这个临时变量是一个常量。此时f()是作为右值
的。写得更清楚一点,如同
X& a=f(); //error
const X& a=f(); //right
而在f5()=X(1)中,f5()做的是左值,并没有什么临时变量产生。
VC并不是一个很规范的c++编译器。并且,完全符合c++ standard
的编译器可能还没有。就好象SUN的CC也不支持name scaping。

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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