首页 > 编程语言 >C++11:右值引用

C++11:右值引用

时间:2022-09-28 18:32:15浏览次数:76  
标签:11 常量 右值 int 绑定 左值 C++ 引用


左值、右值

在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右值”。如:

int b = 1;
int c = 2;
int

在这个赋值表达式中,a就是一个左值,而b + c则是一个右值。

不过C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。那么这个加法赋值表达式中,&a是允许的操作,但&(b + c)这样的操作则不会通过编译。因此a是一个左值,(b + c)是一个右值。

相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。

左值引用、右值引用

左值引用是对一个左值进行引用的类型,右值引用则是对一个右值进行引用的类型。

左值引用和右值引用都是属于引用类型。无论是声明一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名

左值引用是具名变量值的别名,而右值引用则是不具名(匿名)变量的别名。

左值引用:

int &a = 2;       // 左值引用绑定到右值,编译失败, err
int b = 2; // 非常量左值
const int &c = b; // 常量左值引用绑定到非常量左值,编译通过, ok
const int d = 2; // 常量左值
const int &e = c; // 常量左值引用绑定到常量左值,编译通过, ok
const int &b = 2; // 常量左值引用绑定到右值,编程通过, ok

const 类型 &”为 “万能”的引用类型,它可以接受非常量左值、常量左值、右值对其进行初始化。

右值引用,使用&&表示:

int && r1 = 22;
int x = 5;
int y = 8;
int

通常情况下,右值引用是不能够绑定到任何的左值的。

int c;
int && d = c; //err

测试示例:

#include <iostream>
using namespace std;

void process_value(int & i) //参数为左值引用
{
cout << "LValue processed: " << i << endl;
}

void process_value(int && i) //参数为右值引用
{
cout << "RValue processed: " << i << endl;
}

int main()
{
int a = 0;
process_value(a); //LValue processed: 0
process_value(1); //RValue processed: 1

return 0;
}

运行结果如下:

C++11:右值引用_右值

参考资料:
1、​​​C++11 标准新特性: 右值引用与转移语义​​​
2、​​​深入理解C++11:C++11新特性解析与应用​


标签:11,常量,右值,int,绑定,左值,C++,引用
From: https://blog.51cto.com/u_3002289/5720723

相关文章

  • DFS算法练习 POJ1111; POJ1129; POJ2245; POJ2657
    POJ1111:importjava.util.Scanner;/***@Authorjinjun99*@DateCreatedin2022/9/279:49*@Description*@Sinceversion-1.0*/publicclassMain{......
  • 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口
    【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口 使用的环境:VisualStudio2017,创建一个控制台程序作为工程文件1.配置glfw在github上下载GLFW......
  • C++11:初始化
    类内成员初始化classMem{public:Mem(inti):m(i){}//初始化列表给m初始化intm;};classGroup{public:Group(){}private:intdata=1;//使用"=......
  • C++11:移动语义
    为什么需要移动语义#include<iostream>usingnamespacestd;classTest{public:Test(inta=0){//普通构造函数d=newint(a);cout<<"构造函......
  • C++11:std::move和std::forward
    标准库函数std::move既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数......
  • Java11安装(win11)
    下载JDK解压版本下载后解压,并放到一个没有中文路径的目录,如图所示:配置Java环境变量以Windows11系统为例,打开设置,搜索“环境”,点击“编辑系统环境变量”,如图所示:点击......
  • c++可执行文件产生过程
    https://blog.csdn.net/qq_34799070/article/details/125472381#ifndefTEST#defineTEST#include<iostream>usingnamespacestd;voidtest(){cout<<"h......
  • C++问题汇总——长期更新
    避免使用vector<bool>,尽量使用bitset或者deque<bool>因为vector<bool>不是容器,底层是bool值按bit存储STLlist容器数据结构上看是带空头的双向循环链表容器迭代......
  • 视频融合云平台EasyCVR级联时出现报错“Error 1146",是什么原因?
    EasyCVR具备强大的视频接入、汇聚与管理、视频分发、设备管理、用户及角色权限管理等能力。平台可提供的丰富的视频功能,包括:视频监控直播、云端录像、云存储、录像检索与回......
  • 【C++】关于智能指针的简单学习
    智能指针示例类:classString{private: stringm_value;public: String(stringstr):m_value(str){ cout<<"构造"<<m_value<<"\n"; } friendostream&o......