const reference和nonconst reference的区别

时间:2021-03-29 05:29:17
普通的reference必须用与该引用同类型的对象来初始化。例如:
  1. int ival = 1024;
  2. int &refVal = ival;   // ok: refval refers to ival
  3. int &refVal2;         // error: 引用必须初始化
  4. int &refVal3 = 10;    // error: 必须用对象进行初始化,而不能是字面值常量(literal constant)
  5.  
  6. const int ival2 = 256;
  7. int &refVal4 = ival2; // error: 注意const int和int是不同类型
  8.  
  9. register int ival3(512);
  10. int &refVal5 = ival3; // ok: 不管是寄存器变量还是自动变量
而const reference的限制则没那么多。例如:
  1. const int ival = 1024;
  2. const int &refVal1 = ival;  // ok: 类型匹配
  3. const int &refVal2 = 1024;  // ok: 1024称为字面值常量(literal constant),也是const int类型,匹配

  4. const int &refVal3 = ival + 256; // ok: 可以用表达式
  5. const int &refVal4 = fnc(); // ok: 可以是函数返回值

  6. double dval = 3.14;
  7. const int &ri = dval;    // ok: 可以是不同类型
实际上09行在编译时编译器会把它转化为形如
  1. const int temp = dval;
  2. const int &ri = temp;
注意到隐式转换从double型转为const int型,编译时会出现一个warning

参考:
C++ Primer中文版(第4版)