这个程序无法通过编译,函数调用Max(i,5)中,由于5不是左值,不能为它建立引用,所以出现编译错误。在这种情况下,必须修改函数Max()的定义,也就是把它的参数声明为常引用:int Max(const int& a, const int&b),这样就解决问题了。可见,将函数的参数声明为常引用,不完全是因为参数的值在函数体内不能修改,还考虑了接受非左值作为函数实参的情况。
3.常引用的特殊性质对某个变量(或表达式)建立常引用时,允许发生类型转换,而一般的引用则不允许,见下面的程序。
#include <time.h>#include <iostream>using namespace std;int Max(const int& a, const int& b){ return (a>b)?a:b;}int main(int argc,char* argv[]){ char c='a'; const int &rc=c; cout<<(void*)&c<<endl; cout<<(void*)&rc<<endl; int i=7; const int &ri=i; cout<<(void*)&i<<endl; cout<<(void*)&ri<<endl; cout<<Max(rc,5.5)<<endl; getchar();}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
程序输出结果如下:
在这个程序中,如果将语句const int &rc=c;中的const去掉,将发生编译错。原因是一般的引用只能建立在相同数据类型的变量上。同样,之所以允许Max(i,5.5)这样的函数调用,也是因为函数Max()的第二个参数是常引用,因此可以将实参5.5先转换为int类型的无名变量,然后再建立对该无名变量的常引用。
所以,对一个表达式建立常引用时,如果该表达式的结果可以寻址,并且表达式的数据类型与引用类型相同,那么可以直接将该表达式结果的地址送入引用变量。此例中,&i和&ri的值相等就说明了这一点。否则,若表达式的数据类型与引用类型不相同,或是表达式结果不可寻址,那么只能另外建立一个无名临时变量存放表达式的结果(或其转换后的值),然后将引用于无名临时变量绑定,此例中&c与&rc的值不同正好说明了这一点。