这个错误的意思
这个错误是指不能将一个非常量左值引用绑定到一个右值上。
那什么是左值右值?
简单理解,能够放在=左边的称为左值,不能放在=左边,只能放在右边的为右值。
例如:int a = 3;
变量a为左值,3为右值,通常右值为一些临时变量,比如函数返回值。
理解了右值,这个错误就很好理解了。
对于报错的理解
举个例子:
#include <iostream>
using namespace std;
int main() {
double b = 3;
int & a = b;
cout << a << endl;
return 0;
}
// 报错:error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
上边代码报错的原因是,double类型的变量b会隐式转换为int类型,这里产生了一个临时变量(这是一个右值)绑定到引用a上,并不是把实际的b直接绑定到引用a上,所以报错。
注意,因为对于右值来说,修改它的值是无意义的,所以才不能把一个左值引用绑定到一个右值上,但是C++允许把一个const引用绑定到一个右值上,所以下面的代码是正确的:
#include <iostream>
using namespace std;
int main() {
double b = 3;
const int & a = b; // 正确,可以把一个const引用绑定到一个右值上
cout << a << endl;
return 0;
}
常见报错的情况
通常,我们函数参数传递时,采用引用传递常常会遇到这个错误
#include <iostream>
using namespace std;
int add(int &num1, int &num2) {
return num1 + num2;
}
int main() {
cout << add(3, 3) << endl; //这里3是右值,不能绑定到左值引用上
return 0;
}
//报错:error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
上面报错是因为参数3是右值,不能绑定到形参num1和num2左值引用上,所以如果我们不需要改变实参的值,又需要用引用传递参数,建议要把引用定义为常量引用,如下就不会报错了:
#include <iostream>
using namespace std;
int add(const int &num1, const int &num2) {
return num1 + num2;
}
int main() {
cout << add(3, 3) << endl;
return 0;
}