对于引用参数,什么情况下会产生临时变量了?有两种情况:
1、当传入的实际参数类型正确,但不是左值
2、当传入的实际参数类型不匹配,但可以转换为正确的类型
临时变量的有效区间在函数调用阶段。
C++为什么对于产生临时变量的引用参数要加const?
看看这个例子
对于上述代码,有类型不匹配,按照前面的原因,是应该产生临时变量的,但如果产生临时变量,是与swap的设计初衷相违背的,a和b实际是不会交换的,怎样处理这种矛盾。C++选择必须在有const的情况下才能产生临时变量,因此上述代码实际是不能编译通过的。而一旦void swap(int & a, int & b)修改为void swap(const int & a, const int & b),调用部分编译没有问题,只是函数内修改a和b的代码不能编译通过,因为被声明为const了,当然这是另外一个层面的问题了。
当引用参数前有了const后,我们知道函数不会修改参数值,我们也不会关心到底有没有参数临时变量。
注:
什么是左值:就是可以通过地址引用的数据对象,例如变量、数组元素、结构体成员,引用,解引用的指针等。
非左值:包括字符常量(双引号包含的字符串),表达式
左值在过去指的是能够位于赋值操作符左边,但const引入后,这种定义就不准确了。但const变量因为可以通过地址引用,因此也是一种左值,即不能改变的左值。
1、当传入的实际参数类型正确,但不是左值
2、当传入的实际参数类型不匹配,但可以转换为正确的类型
临时变量的有效区间在函数调用阶段。
C++为什么对于产生临时变量的引用参数要加const?
看看这个例子
void swap(int & a, int & b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
long a = 3, b = 5;
swap(a, b);对于上述代码,有类型不匹配,按照前面的原因,是应该产生临时变量的,但如果产生临时变量,是与swap的设计初衷相违背的,a和b实际是不会交换的,怎样处理这种矛盾。C++选择必须在有const的情况下才能产生临时变量,因此上述代码实际是不能编译通过的。而一旦void swap(int & a, int & b)修改为void swap(const int & a, const int & b),调用部分编译没有问题,只是函数内修改a和b的代码不能编译通过,因为被声明为const了,当然这是另外一个层面的问题了。
当引用参数前有了const后,我们知道函数不会修改参数值,我们也不会关心到底有没有参数临时变量。
注:
什么是左值:就是可以通过地址引用的数据对象,例如变量、数组元素、结构体成员,引用,解引用的指针等。
非左值:包括字符常量(双引号包含的字符串),表达式
左值在过去指的是能够位于赋值操作符左边,但const引入后,这种定义就不准确了。但const变量因为可以通过地址引用,因此也是一种左值,即不能改变的左值。
本文探讨了C++中引用参数与临时变量的关系,解释了何时会创建临时变量及为何需要添加const限定符。同时介绍了左值的概念,并讨论了在函数调用期间临时变量的有效范围。

1488

被折叠的 条评论
为什么被折叠?



