【转载】c++错误:C++右值引用出现的问题(cannot bind non-const lvalue reference of type ‘int&‘ to an rvalue of type ‘i

左值和右值
  • 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);
}

【转载】c++错误:C++右值引用出现的问题(cannot bind non-const lvalue reference of type ‘int&‘ to an rvalue of type ‘i_第1张图片上述代码异常显示:不能将非常量的左值引用绑定到右值,下面我们根据这个报错信息,做如下展开分析。

先说一下修改策略
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;}
  
  
    
    
    
    

在这里插入图片描述【转载】c++错误:C++右值引用出现的问题(cannot bind non-const lvalue reference of type ‘int&‘ to an rvalue of type ‘i_第2张图片

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

4、什么是完美转发

你可能感兴趣的:(C++常见错误,c++)