免费注册 查看新帖 |

Chinaunix

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

[C++] 让我困惑的引用,左值右值的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-08 12:07 |只看该作者 |倒序浏览
#include <iostream>
using namespace std;

int main() {
    int i = 2;
    double &r = i;
    return 0;
}


gcc error: invalid initialization of reference of type 'double&' from expression of type 'int'

如果改成
const double &r = i;
没有问题。

看过一些解释:如果初始化引用,=右边必需要么是左值(lval)要么能有函数把它变成左值,否则在定义的时候就必需声明为常量引用形式。

难道这里的i不是左值?

程序改成
int main() {
    double i = 2;
    double &r = i;
    return 0;
}


没有错误
难道这里的i又是左值啦?

现在比较困惑引用,左值和右值就更加困惑了。

论坛徽章:
0
2 [报告]
发表于 2010-01-08 12:11 |只看该作者
const double &r = i;

由于类型不匹配,实际相当于:

const double inner_tmp = (double)i;

const double &r = inner_tmp;

临时的中间变量都是const,所有没有const的引用会失败。

论坛徽章:
0
3 [报告]
发表于 2010-01-08 12:26 |只看该作者
原帖由 drangon 于 2010-1-8 12:11 发表
const double &r = i;

由于类型不匹配,实际相当于:

const double inner_tmp = (double)i;

const double &r = inner_tmp;

临时的中间变量都是const,所有没有const的引用会失败。


谢谢,是不是每一个赋值的操作都会有中间变量的参与?

[ 本帖最后由 smartvessel 于 2010-1-8 12:29 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2010-01-08 12:28 |只看该作者

回复 #2 drangon 的帖子

double i = 2;
    double &r = i;

如何解释这样,却又是没有报错的呢?

论坛徽章:
0
5 [报告]
发表于 2010-01-08 13:21 |只看该作者
C++ primer 4th
对你的问题有一段专门说明

论坛徽章:
0
6 [报告]
发表于 2010-01-08 14:20 |只看该作者
原帖由 redspider 于 2010-1-8 13:21 发表
C++ primer 4th
对你的问题有一段专门说明

身边没有这本书,可否说明在那一章节,或者明示在下。

论坛徽章:
0
7 [报告]
发表于 2010-01-08 14:42 |只看该作者
原帖由 smartvessel 于 2010-1-8 12:28 发表
double i = 2;
    double &r = i;

如何解释这样,却又是没有报错的呢?


引用r和变量i的类型相同,所以不产生临时变量,因此没有错误。

是不是这样理解的?

论坛徽章:
0
8 [报告]
发表于 2010-01-08 14:47 |只看该作者
对“普通”的T&,初始式必须是一个类型T的左值,而对于一个const T&的初始式不必是一个左值,甚至可以不是类型T的。

论坛徽章:
0
9 [报告]
发表于 2010-01-08 14:48 |只看该作者
版上是否有关于“左值”的精华帖?

论坛徽章:
0
10 [报告]
发表于 2010-01-08 16:12 |只看该作者
左值右值关系不大,是引用的特性
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP