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

左值和右值

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

🧡🧡🧡请看如下代码

#include
#include
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、左值和右值概念以及判断

  1. 左值:左值的英文为 locator value 简写为:lvalue,可以为存储在内存中,有明确存储地址(即可寻址)的数据
  2. 右值:右值得英文为 read value 简写为:rvalue,指的是那些可以提供数据值得数据(不一定可寻址,例如存储与寄存器中的数据)
  3. 如何判断一个表达式是左值还是右值
  4. 可位于赋值号(=)左侧表达式的就是左值,反之只能位于赋值号右侧表达式的就是右值。
1:可位于赋值号(=)左侧表达式的就是左值,反之只能位于赋值号右侧表达式的就是右值。
int a = 5 ; // 变量a 就是左值,字面量值5 就是右值
int b = 10 // b是一个左值
a=b // a,b都是左值,只不过b可以当做右值使用
10=b // error : 10是一个右值,不能当做左值使用
  1. 有名称的,可以获取到存储地址的表达式就是左值,反之为右
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、什么是完美转发


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部