小众知识

首页 > 正文

用const限定引用的问题

有下例程序段:
cosnt int a=123;
const int* pa=&a;
const int*& ra=pa;  //ok
const int*& ra=&a;  //error
const int* const& ra=&a;//ok
const int*& const ra=&a;//error;
请问各位高手,为什么第三行是对的,第四行却是错的?
             还有第四行中的ra表示的是什么意思,为什么const要放在&前面?  

 jiangpeng 发表于:2003-09-10 22:58:29
得分:6 

引用是接受变量,不接受地址 

 xplichao 发表于:2003-09-10 23:01:10
得分:0 

但是const int* const& ra=&a;是正确的,它也是接受地址 

 jiangpeng 发表于:2003-09-10 23:28:38
得分:0 

const int*& const ra=&a; 
warning C4227: 使用了记时错误 : 忽略引用上的限定符
上式等价于
const int*& ra=&a;

纠正我前面的错误

&a现在是一个临时的指针(相当一个常量,rvalue)
const int*&是一个变量(变量的类型为const int*,lvalue)的引用。
lvalue的引用是不能代表一个rvalue的,这是神圣的标准定义了的
只有rvalue的引用可以代表一个rvalue。rvalue的引用就是
const int* const &

 wkkevin 发表于:2003-09-11 11:59:06
得分:5 

按照钱能的说法,
const int*& ra=&a;  
相当于
int* tmp = &a;
const int*& ra = tmp;
但是在vc6里面没法编译通过,tc++就可以, 

 jiangpeng 发表于:2003-09-11 13:52:52
得分:0 

可a是个const int呀
tmp也就应该是const int* const
所以就是ra就应该是const int* const& 

 meimj 发表于:2003-09-11 14:33:41
得分:0 

第三行已经初始化了, 第四行当然不能再次初始化了 

 yangnix 发表于:2003-09-11 21:01:46
得分:0 

pa 本身就是一个地址,他的前面z再加个&那是什么意思呢?你看看这样怎么样呢:
      const *& ra=*pa; 

 jiangpeng 发表于:2003-09-11 21:24:30
得分:0 

pa dereference(解引用,侯sir译为提领)后的类型是const int
const *是个什么搞不清楚,但如果是*pa的refernece应该是
const int& ra = *pa; 

 jiangpeng 发表于:2003-09-11 21:27:25
得分:0 

sorry
refernece应改为reference 

 bestsmoke 发表于:2003-09-11 21:29:23
得分:2 

不能将常量赋给非常常量的指针或引用,因为那样会导致常量可能被修改。
第四行的意思是:将常量a的地址赋给指向整型常量的常量指针,因为此指针是常量指针,所以编译通过。 

 bestsmoke 发表于:2003-09-11 21:31:31
得分:0 

不能将常量赋给非常量的指针或引用,因为那样会导致常量可能被修改。
第四行的意思是:将常量a的地址赋给指向整型常量的常量指针,因为此指针是常量指针,所以编译通过。

晕~~多打了个字:“不能将常量赋给非(常)常量的指针或引用”
应该是非常量,而不是非常常量~~~汗。。。。。。。

 jiangpeng 发表于:2003-09-11 21:55:19
得分:0 

const int*& ra=&a;  //error
const int* const& ra=&a;//ok
★ &a的类型是const int * const
const int*& const ra=&a;//error;
★ const对&的修饰是无效的所以const int*& const等价于const int*&

 wowowowo 发表于:2003-09-11 22:05:56
得分:2 

不允许非const引用指向需要临时对象的对象或值

const int*& ra=&a;//error
const int* const& ra=&a;//ok
const int*& const ra=&a;//error;
因为&a 所以有临时变量 那么必须用const引用 也就
const int*const& ra=&a;//ok
const int* const& ra=&a;//ok
const int*const& const ra=&a;//ok;

 jiangpeng 发表于:2003-09-11 22:15:57
得分:0 

const int* const& const ra = &a
warning C4227: 使用了记时错误 : 忽略引用上的限定符
证明对reference进行const限定的时候是没有必要的,因为reference本身就是不可改写的 

 xplichao 发表于:2003-09-11 22:30:27
得分:0 

请问jiangping(JP):
我也知道对reference进行const限定是没有必要的,但是
const int* const& ra=&a 中的第二个const到底是限定谁的?
还有在"不允许非const引用指向需要临时对象的对象或值"这一句中,"const引用"是不是指引用"是不是指一个引用const变量的引用? 

 xplichao 发表于:2003-09-11 22:44:38
得分:0 

是不是就像const int& b=123必须限定const一样,
const int* const& ra=&a 只是const (const int*)& ra=&a 的正确写法,
而后一种写法是错误的? 

 jiangpeng 发表于:2003-09-11 22:55:18
得分:0 

第二个const限定的是const int*类型指针
&a是一个指向const int类型的指针常量,类型为const int* const
b的类型是一个const int类型变量的引用,而不是一个int变量的const引用
永远不要用const来修饰引用
遇到const时不要把它看成引用的一部分,而要把它看为引用所代表对象的修饰

 TianGuangZao 发表于:2003-09-12 08:01:47
得分:5 

上面的解释有的地方不敢同意,同意 bestsmoke((嘿嘿))
关键是要学会掌握 C++ 的读法,推荐采用“由右向左”的次序来读:
const int a=123;
读法: a 为一个整数变量,内容不可改变。

const int* pa=&a;
* 代表定义一个指针,const int 表示指向的对象的性质。
读法: pa 为一个指向整数变量的指针,不能通过 pa 修改该整数变量的内容;
       把整数变量 a 的地址赋给指针 pa。

const int*& ra=pa; //ok
这里 & 代表要定义一个引用, const int*  表示引用对象的性质。
为了清楚一些,不妨写成:
const int* &ra = pa;
读法:ra 为一个对象的引用,该对象为一个指向常量整数变量的指针,这里即为 pa.

const int*& ra=&a; //error
为什么会出错呢?我们先来分析一下:
& 修改 ra, 代表要定义的是一个引用,const int* 表示要引用的对象,
显然要引用是一个指向常量整数变量的未命名指针,也就是说 ra 是该指针的别名;
然后我们把常量整数变量 a 的地址赋给 ra.
错就错在引用毕竟和指针不同,引用相对于常量指针,一旦固定就不能改变,也就是说它只能指向a,而指针还可以指向其它对象如 b, c 等,修改如下:
const int* const& ra=&a;//ok
表示引用一个常量指针,该指针指向一个常量整数变量;用整数变量 a 的地址给他赋值。

const int*& const ra=&a;//error;
该错误同上。还有 ra 本身是个引用,不能改变,没必要用 const 来修饰。

 jiangpeng 发表于:2003-09-12 09:19:11
得分:0 

引用就是作为对象的别名存在的
const int* const &ra = &a;
ra代表什么???
不就是代表&a吗
而&a又是什么???
不就是const int类型变量a的地址的一个临时值吗
临时值可以被改变吗???
不能,所以它是一个rvalue,是个const
怎么表示一个不可写的指针呢???
TYPE* const
const修饰的是什么???
const修饰的是一个指向TYPE的指针
ra所代表的对象类型应该是什么呢???
const int* const 

 jiangpeng 发表于:2003-09-12 09:19:50
得分:0 

引用就是作为对象的别名存在的
const int* const &ra = &a;
ra代表什么???
不就是代表&a吗
而&a又是什么???
不就是const int类型变量a的地址的一个临时值吗
临时值可以被改变吗???
不能,所以它是一个rvalue,是个const
怎么表示一个不可写的指针呢???
TYPE* const
const修饰的是什么???
const修饰的是一个指向TYPE的指针
ra所代表的对象类型应该是什么呢???
const int* const 

 erlia 发表于:2003-09-13 09:12:51
得分:0 

看看 

 lyr311 发表于:2003-12-16 22:10:16
得分:0 

Mark! 

上一篇:C++之父"Bjarne Stroustrup"的名字应该怎样读。
下一篇:borland C++ Complier环境设定????

分享到: