这个问题还得从左值说起,左值最直观形象的解释就是,它一般处于表达式的左侧,它本身是具有内存空间的。
在《c++ primer》一书中,文中举出了一个用来交换参数的小例子,并且跟C语言中值传递以及指针传递做了对比,我们清楚的知道,值传递是无法对值做交换的。并且函数参数若为值传递时,进入函数体时,会创建临时变量,并完成一次值拷贝操作,若临时变量空间很大则会很耗时。此外,由于引用传参会对原值进行修改,因此为了避免修改原值的问题出现,可以选用值传递,但既要引用传递,又要保证函数内部值不会对其做修改,那么我们就需要利用const修饰符了,那么同样新的问题就又来了。
#include <iostream>
using namespace std;
int ref_cube(int &a);
int main()
{
int a = 3
cout<< "a value is :" << ref_cube(a) << endl;
return 0;
}
int ref_cube(int &a)
{
return a*a;
}
如上这是一个简单的例子,那么如果我们调用参数时,直接传入值而不是变量呢?
ref_cube(3); // error:invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int' 非常量引用的初始值必须为左值
因为此时传入的3是一个临时变量,即他是没有空间的,即右值,并且这个值是一个常量,若函数内部对这个常量值进行就改了那岂不是自相矛盾了。
因此const修饰符的作用不仅可以保证传入的值不被修改,而且可以保证编译器可以为这个右值创建临时变量,但这些临时变量只在函数调用期间有效。
临时变量的创建条件
- 实参的类型正确,但不是左值。(如上例子)
- 实参的类型正确,但可以转换为正确的数据类型。
float c = 3.2f; ref_cube(c);//error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int' 无法用float类型初始化int&类型的引用