Q1: 引用初始化的右值不能是立即数吗?
A1:未必,对于const引用初始化的右值可以是立即数或者表达式。如
     const int& a = 3; const double &b = 3.14+a;
 
Q2: 对于常量的引用,其值是否绝对不可修改
A2:未必,看如下代码:
      int a = 3; const int& b = a;a = 4; cout << b << endl;
      只要被引用对象被修改,引用值一样可以修改。
 
Q3: 可以将常量传递给非常量引用吗?
A3:不可,否则会有语法错误,但是变量可以传递给常量引用:
     int a = 3;
    const int aa = 4; 
    const int &b = a; // 合法
    int &bb = aa; // 不合法! 
 
Q4:为什么函数的参数推荐如果不作修改的话用const TYPE&...,而作修改的用TYPE&……呢?
A4:
1,效率:按引用调用不需要产生副本,它只是原变量的别名。
2,可读性:如果要修改变量,和按指针传递传递比起来,可读性好很多。比如swap
void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
而按引用调用则是
void swap(int& a, int& b)
{
    int  temp = a;
    a = b;
    b = temp;
}
对于不作修改的值,const是推荐的也是必要的,保证其值不被修改只是一方面,另一方面,因为我们知道要传递的是不做修改的值,也就是允许我们传递常量,如果参数不加const,正如之前所言,将常量传递给非常量的引用将出现语法错误,所以const必须加上。