将参数作为const引用传递给普通引用

时间:2011-10-27 16:23:33

标签: c++

  

可能重复:
  How come a non-const reference cannot bind to a temporary object?

有这样的代码:

void fun_ref(int& par){}

void fun_const_ref(const int& par){}

int main(){

  //fun_ref(2); error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’
  fun_const_ref(2);

  char var = 3;
  //fun_ref(var); error: invalid initialization of reference of type ‘int&’ from expression of type ‘char’
  fun_const_ref(var);
  return 0;
}

为什么可以传递rvalue和不同的数据类型而不是函数参数类型以进行常量引用,但是对于非常量引用是不可能的?

3 个答案:

答案 0 :(得分:3)

当参数是const引用并且传递的参数不是该类型但是存在对该类型的隐式转换时,实现将把值保存在临时中并使用这样的临时参数。所以const版本没有引用char var而是引用int __temp

答案 1 :(得分:1)

在第一种情况下,2是临时的,因此它只能绑定到const引用;这就是为什么你不能用它来呼叫fun_ref

在第二种情况下,varchar,因此无法绑定到int&。但是,var可以转换为临时int,可以绑定到const int&,如上所述;那是因为隐性转化而起作用。

答案 2 :(得分:0)

编译器可以通过隐式转换创建函数参数类型的临时值,并将其作为const引用传递。这不适用于引用类型,因为临时值不能作为非const引用传递。

编辑:不允许对临时对象进行非常量引用,因为标准是这样说的。这背后的原因是获取非const引用的函数将更改其参数(否则您可能已经创建了引用const),并且当临时超出范围时这些更改将丢失。