可能重复:
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和不同的数据类型而不是函数参数类型以进行常量引用,但是对于非常量引用是不可能的?
答案 0 :(得分:3)
当参数是const引用并且传递的参数不是该类型但是存在对该类型的隐式转换时,实现将把值保存在临时中并使用这样的临时参数。所以const版本没有引用char var
而是引用int __temp
。
答案 1 :(得分:1)
在第一种情况下,2
是临时的,因此它只能绑定到const
引用;这就是为什么你不能用它来呼叫fun_ref
。
在第二种情况下,var
是char
,因此无法绑定到int&
。但是,var
可以转换为临时int
,可以绑定到const int&
,如上所述;那是因为隐性转化而起作用。
答案 2 :(得分:0)
编译器可以通过隐式转换创建函数参数类型的临时值,并将其作为const引用传递。这不适用于引用类型,因为临时值不能作为非const引用传递。
编辑:不允许对临时对象进行非常量引用,因为标准是这样说的。这背后的原因是获取非const引用的函数将更改其参数(否则您可能已经创建了引用const),并且当临时超出范围时这些更改将丢失。