C++编译报错:cannot bind non-const lvalue reference to an rvalue

这个错误的意思

这个错误是指不能将一个非常量左值引用绑定到一个右值上。

那什么是左值右值?

简单理解,能够放在=左边的称为左值,不能放在=左边,只能放在右边的为右值。
例如: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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容