600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > C++右值引用出现的问题(cannot bind non-const lvalue reference of type ‘i

C++右值引用出现的问题(cannot bind non-const lvalue reference of type ‘i

时间:2019-01-31 06:40:16

相关推荐

C++右值引用出现的问题(cannot bind non-const lvalue reference of type ‘i

左值和右值

💛1、左值和右值概念以及判断💚2、左值引用和右值引用概念2.1、左值引用2.1、右值引用 💙3、std::move()与移动语义💜4、什么是完美转发

🧡🧡🧡请看如下代码

#include<iostream>#include<string>using namespace std;// 测试左值、右值引用相关问题void Sweap(int& pa, int& pb){cout<< "交换之前:"<< pa << " "<< pb <<endl;int temp = pa;pa = pb;pb = temp;cout<< "交换之前:"<< pa << " "<< pb <<endl;}int main(){int ia = 1;int ib = 2;// error: Sweap(1,ib);}

上述代码异常显示:不能将非常量的左值引用绑定到右值,下面我们根据这个报错信息,做如下展开分析。

先说一下修改策略

1:形参可以修改为右值引用

void Sweap(int&& pa, int& pb) {}

2:形参修改为常量的左值引用

void Sweap(const int& pa, int& pb)

💛1、左值和右值概念以及判断

左值:左值的英文为 locator value 简写为:lvalue,可以为存储在内存中,有明确存储地址(即可寻址)的数据右值:右值得英文为 read value 简写为:rvalue,指的是那些可以提供数据值得数据(不一定可寻址,例如存储与寄存器中的数据)如何判断一个表达式是左值还是右值可位于赋值号(=)左侧表达式的就是左值,反之只能位于赋值号右侧表达式的就是右值。

1:可位于赋值号(=)左侧表达式的就是左值,反之只能位于赋值号右侧表达式的就是右值。int a = 5 ; // 变量a 就是左值,字面量值5 就是右值int b = 10 // b是一个左值a=b // a,b都是左值,只不过b可以当做右值使用10=b // error : 10是一个右值,不能当做左值使用

有名称的,可以获取到存储地址的表达式就是左值,反之为右

1:可位于赋值号(=)左侧表达式的就是左值,反之只能位于赋值号右侧表达式的就是右值。int a = 5 ; // 变量a 就是左值,字面量值5 就是右值int b = 10 // b是一个左值a=b // a,b都是左值,只不过b可以当做右值使用10=b // error : 10是一个右值,不能当做左值使用以上面定义的变量a、b为例,a和b 是变量名,那么可以通过&a和&b获取他们存储地址,因此 a和b都是左值,反之,字面量 5,10他们既没有名称也无法获取存储地址(因为字面量通常存储在寄存器或者和代码一起),因此5,10都是右值

💚2、左值引用和右值引用概念

2.1、左值引用

**基本语法: type &引用名 = 左值表达式**

2.1、右值引用

基本语言: type &&引用名 = 右值表达式

😇😇😇来看一下左值和右值引用的例子

其实C++之所以设计出右值引用的语言:

主要还是因为对弈类似 b+1;这样的运算是发生在CPU寄存器上,寄存器上不能对其取地址,赋值等操作,所以这类符号(如加号+)只能放在右边,将其赋值给其他变量。

int main(){cout << "-----引用左值-----------"<<endl;int a = 5;int &add_a(a);cout << "a= "<<a << " ,"<< "&a= "<< &a<< endl;cout<< "add_a = "<< add_a<< " ,"<< "&add_a ="<< &add_a << endl;cout<< "-------引用右值---------"<< endl;int b = 10;int &&add_b = 10+1; // 等价于 int &&add_b(b+1)cout<<"b = "<< b << " ,"<< "&b = "<< &b<< endl;cout<< "add_b = "<<add_b << " ,"<< "&add_b = "<< &add_b<< endl;add_b++;cout<< "add_b++ =" << add_b << " ,&add_b = "<< &add_b<<endl;}

在这里插入图片描述

💙3、std::move()与移动语义

💜4、什么是完美转发

C++右值引用出现的问题(cannot bind non-const lvalue reference of type ‘int‘ to an rvalue of type ‘int‘)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。