E0461-非常量引用的初始值必须为左值

最近敲代码遇到了这个问题,回顾了一下左值,右值,常量引用这些概念。下面让我们来看看这个报错的原因是什么吧。


一、出现这个错误的原因是什么呢?

#include<iostream>
using namespace std;
void func(int& x)
{
	cout << x << endl;
}

int main()
{
	int num = 10;
	func(num);
	func(10);//本行代码出现错误
	return 0;
}

首先,引用变量时是通过地址来确定引用的对象的。因为10(右值)是一个字面常量,通常不会在内存中占据一个地址,找到不到所谓的10自然会报错。当我们用num传参是num(左值)是一个变量可以取到它的地址,可以找到num不会报错(什么是左值什么是右值在下面会说明)。

二、解决方法

1.通过常量引用去解决

代码如下(示例):

#include<iostream>
using namespace std;
void func(const int& x)
{
	cout << x << endl;
}

int main()
{
	int num = 10;
	//func(num);
	func(10);//不会报错
	return 0;
}

常量引用可以支持引用右值。const int& x = 10;中的const关键字表示x是一个常量引用,它可以绑定到一个常量上。在这种情况下,编译器会创建一个临时的int变量,然后将a绑定到这个临时变量上,从而使得这条语句合法。这样可以通过常量引用来访问常量的值,而且不会对常量进行修改。


三、什么是左值、右值以及区分方法

        在C++中所有值不是左值,就是右值。左值是指的表达式结束仍然可以存在的对象,而右值是指表达式结束后就不再存在的临时对象。快速区分左右值方法,判断是否可以对表达式取地址,如果可以对表达式取地址,则为左值,否则为右值。例如下面的例子:

#include<iostream>
using namespace std;
class A
{
public:
	int m_num;
};

A getNum()
{
	return A();//构造一个A对象 以值的方式返回
}

int main()
{
	int a1 = 1;     //a1是左值,1是右值
	int a2 = a1 + 1;//a2是左值,a1+1是右值
	A a = getNum(); //a是左值,getNum()的返回值是右值(返回临时变量)
	return 0;
}

   本例子中a1可以取地址是左值,1不可取地址是右值。a2可以取地址是左值,a1+1不可以取地址是右值。getNum()返回的是一个临时变量(A a = getNum(); 此行代码结束getNum()返回的对象就会被销毁,不能取地址,是右值。)


总结

本篇文章简单的介绍了一下E0461错误产生的原因和解决方法。希望可以对大家有所帮助。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值