免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5765 | 回复: 8
打印 上一主题 下一主题

[C++] 为什么c++不允许将临时对象赋给非常量引用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-19 21:54 |只看该作者 |倒序浏览
假设A是一个用默认构造函数的类
const A& a = A() //合法
A& a = A()          //不合法

我的理解是把一个临时变量赋给引用后,这跟定义了一个有命变量就没有区别,为什么不允许赋给非常量的引用呢?
求达人答疑
谢谢。

论坛徽章:
0
2 [报告]
发表于 2007-09-19 21:55 |只看该作者
read C++ Primer

论坛徽章:
0
3 [报告]
发表于 2007-09-19 22:50 |只看该作者
因为临时变量是const的

论坛徽章:
0
4 [报告]
发表于 2007-09-20 13:35 |只看该作者
为什么c++要规定临时变量是const的呢?我觉得在表达式里生成的临时变量可以是const的,但是如果是把临时变量赋给一个引用就没必要是const的了,不知道语言设计的时候是基于什么考虑的?疑惑中...

论坛徽章:
0
5 [报告]
发表于 2007-09-20 14:18 |只看该作者
以C++的语义来说,如果一个程序员只想传递参数给函数,而不希望函数修改传入的参数时,那么,或者使用值传递,或者采用常量型引用。考虑到大对象复制时产生的开销,一般使用常量型引用const &。如果函数的参数是某个类型的一个非常量的引用,那就相当于告诉编译器,程序员希望得到函数对参数的修改结果。
临时变量是由编译器生成的,C++语言规范没规定编译器生成临时变量的规则,程序员无法得知由编译器生成的临时变量的名字,程序员无法访问那个临时变量。这意味着,以引用的方式传递一个临时变量做为函数参数,如果函数内部对此临时变量做了修改,那么函数返回后,程序员无法获得函数对临时变量的修改。函数对临时变量所做出的所有更改,都将丢失。
一方面,在函数申明中,使用非常量型的引用告诉编译器你需要得到函数对某个对象的修改结果,可是你自己又不给变量起名字,直接丢弃了函数的修改结果,编译器只能说:“大哥,你这是干啥呢,告诉我把结果给你,等我把结果给你了,你又直接给扔了,你这不是在玩我吗?”

论坛徽章:
0
6 [报告]
发表于 2007-09-20 14:49 |只看该作者
string& make_upper(string& s){
    transform(s.begin(),s.end(),::toUpper());
    return s;
}

string& s = make_upper(string("hello,world"));  //1
char text[] = "hello,world";                     
make_upper(text);                               //2

第一条语句是有意义的。
第二条语句可能有问题,在参数传递时会生成一个临时变量,函数对临时变量进行修改而没有修改text。规定临时变量只能赋给是const 引用是因为这个原因吗?因为这样,在编译的时候就可以发现这个问题。

论坛徽章:
0
7 [报告]
发表于 2007-09-24 00:14 |只看该作者
原帖由 zwylinux 于 2007-9-19 22:50 发表
因为临时变量是const的


这是一种常见的误解。然而,临时对象 A() 可不是 const 的,因为 A() = A() 是合法的表达式。

关于什么时候进行常量引用,可参考我在这个帖子中的说明:http://bbs.chinaunix.net/viewthread.php?tid=939006

论坛徽章:
0
8 [报告]
发表于 2007-10-01 11:59 |只看该作者
原帖由 zwylinux 于 2007-9-19 22:50 发表
因为临时变量是const的

正解!

论坛徽章:
0
9 [报告]
发表于 2007-10-01 12:19 |只看该作者
原帖由 liu1061 于 2007-10-1 11:59 发表

正解!

看你LS的帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP