关于引用的一个释疑

    技术2025-08-15  9

    今天复习了下模版,写了如下一个程序

    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

    最新回复(0)