社区
C语言
帖子详情
关于<>中的一个问题
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)可以运行,这是怎么回事?
...全文
200
5
打赏
收藏
关于<>中的一个问题
中文版中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)可以运行,这是怎么回事?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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。
java
中
基于mybatis和strus2的数据库分页代码实现
前言: 在上篇文章
中
已经介绍分页使用的原理以及sql语句 本篇将要介绍分页基本代码实现,以及分页工具类的封装 java
中
基于mybatis和strus2的数据库分页代码实现 分析: 如果要实现分页,我们需要知道数据库
中
数据条数的总数count 利用总条数再根据需求每页展示的数目条数num可以求出页面总数pageCount 我们还要从jsp页面获取页码pageIn...
方法代码Strus2 + pager-taglib 实现分页总结
本文是一篇关于方法代码的帖子 看到坤哥的博客,自己竟然也现出这个
问题
了,那就在这行进一下总结习学! 尚学堂的OA
中
实现时用Filter来为ThreadLocal对象的PagerSize和Offset设值.这样就够能态动入加值而用不改修manager层的代码逻辑,这是AOP(面向切面程编)的想思. 经本人测试直接把代码移植过去后在Struts1.x
中
应...
单体架构存在的
问题
单体架构存在的
问题
复杂性高,模块多,模块边界模糊,代码质量参差不齐,每次修改代码都心惊胆战。 技术人员更新快,不可能一直在
一个
公司,新入职人员可能会遇上离职人员的没有修复的bug。 随着单体应用功能越来越多,部署时间也会越来越长,出错概率比较高。 可靠性差,比如死循环导致整个应用的崩溃。 4 可靠性差,比如死循环导致整个应用的崩溃。 扩展能力受限,有的模块是计算密集型的,需要强大的cpu,有的...
php strus2 漏洞攻击_渗透测试代码审计之PHP反序列化攻击漏洞讲解
PHP反序列化防御serialize()和unserialize()说到反序列化就要先说序列化,反序列化和序列化都伪造着两个函数来弄。serialize()是用于将类转换为
一个
字符串unserialize()用于将字符串转换回
一个
类连载()<?php class test{ var $test='123'; } $class1=new test; $class_ser=seriali...
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章