C++非常量引用的初始值必须为左值问题解决以及引用传参

这个问题还得从左值说起,左值最直观形象的解释就是,它一般处于表达式的左侧,它本身是具有内存空间的

在《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&类型的引用
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值