今天复习了下模版,写了如下一个程序
template <typename T>
void fun(std::ostream &os,T &e)
{
os<<e;
}
然后如下调用:
fun(cout,11);
出现如下编译错误:
error C2664: “fun”: 不能将参数 2 从“int”转换为“int &”
baidu后,网上的一些解释不能释疑,还是c++ primer好,疑问终于解决,原文如下
const 引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:
int i=42;
const int &r=42;
const int &r2=r+i;
同样的初始化对于非const引用是不合法的,会导致编译错误。原因很微妙,值得解释一下:
假如我们编写
double dval=3.14;
const int &ri=dval;
编译器会把这些代码转换成以下形式的编码:
int temp=dval;//从double生成临时的int
const int &ri=temp;
如果ri不是const,那么可以给ri赋一新值,这样做不会修改dval,而是修改了temp,dval不会被修改。仅允许const引用绑定到需要临时使用的值完全避免了这个问题,以为const引用是只读的。
所以:
非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定要右值,如字面值11