当前位置: 首页 > news >正文

左值引用与右值引用

一、左值引用与右值引用的区别

1.左值引用是对左值的引用;右值引用是对右值的引用(不过也有特例)

const左值引用能指向右值,不过不能修改;右值引用通过std::move(v)可以指向左值

声明出来的左值引用或者右值引用都是左值(int& lref = n, int&& rref = 20, lref和rref都是左值)

2.左值引用与右值引用在功能上的差异

(1)左值引用:左值引用用来传参或者做函数返回值可以避免对象的拷贝

(2)右值引用:实现移动语义和完美转发

①移动语义:通过实现移动语义,对象赋值时,避免资源的重新分配(移动构造和移动赋值构造)

②完美转发:函数模版可以将自己的参数完美地转发给内部调用的其他函数

完美指的是不仅能准确地转发参数的值,还能保证被转发的参数的左右值属性不变

// 接受左值引用的函数
void func(int &n) 
{
    std::cout << "lvalue=" << n << std::endl;
}

// 接受右值引用的函数
void func(int &&n) 
{
    std::cout << "rvalue=" << n << std::endl;
}

// 模板函数,使用std::forward完美转发
template<typename T>
void revoke(T &&t) 
{
    // 函数模版的参数 -完美交给-> 内部的函数
    // 参数的值 + 参数的左右值属性
    func(std::forward<T>(t)); 
}

int main() {
    int num = 10;
    revoke(num);  // 传入左值 lvalue=10
    revoke(20);   // 传入右值 rvalue=20
    return 0;
}

借助T&&实现转发语义,引入了引用折叠规则:参数为左值或左值引用,T&&将转化为A&;参数为右值或右值引用,T&&将转化为A&&

std::forward<T>(v) T为左值引用类型,v将转化为 T类型的左值;T为右值引用类型,v将转化为 T类型的右值

二、区分左值和右值

1.左值:可以在等号左边,能够取地址,具名(下面举一些例子)

变量名、前置自增和自减(++i,--i)、解引用表达式

返回左值引用的函数调用

// 定义一个函数,返回vector<int>中指定位置元素的左值引用
std::vector<int>& getElement(std::vector<int>& vec, size_t index) {
    return vec[index];
}

std::vector<int> numbers = {1, 2, 3, 4, 5};
// 调用函数获取左值引用
// getElement(numbers, 2)这个函数调用就是左值
int& ref = getElement(numbers, 2);

赋值运算或复合赋值运算符表达式

// (i = 9)是左值
(i = 9) = 1000;
std::cout << "i:" << i << std::endl; // i:1000
// (i += 20)是左值
(i += 20) = 10000;
std::cout << "i:" << i << std::endl; // i:10000

2.右值:只能在等号右边,不能取地址,不具名;右值分为两大类,纯右值和将亡值

(1)纯右值:字面值、返回非引用类型的函数调用、后置自增和自减

算术表达式[a+b]、逻辑表达式[a&&b]、比较表达式[a==b, a >= b]

(2)将亡值:C++11新引入的与右值引用[移动语义]相关的值类型

将亡值用来触发移动构造移动赋值构造,进行资源转移,之后将亡值将调用析构

std::move static_cast<T&&>(x) 可以将左值转化为将亡值(将左值转换为右值、使拷贝变为移动)

相关文章:

  • NO.22十六届蓝桥杯备战|一维数组|七道练习|冒泡排序(C++)
  • 对seacmsv9进行sql注入,orderby,过滤information_schema
  • 构建神经网络之常用pandas(补充中 )
  • leetcode459 重复的子字符串 周期性字符串问题 KMP算法
  • 解析AI工具库中三款 AI 图片转页面工具
  • Vidma Ver.2.14.0 高级版
  • OpenSSL 基础使用流程
  • 2025年山东省职业院校技能大赛(高职组)“云计算应用”赛项赛卷1
  • 洛谷 P1067 [NOIP 2009 普及组] 多项式输出(详解)c++
  • HTML AI 编程助手
  • 用大白话解释 持久框架Mybatis-Plus——像“瑞士军刀”一样简单
  • 风控算法技术图谱和学习路径
  • 如何在VUE框架下渲染出来一个水球图
  • MongoDB快速入门
  • 大白话React第十章React 前沿技术在企业级应用中的深度实践
  • 从FLM获取算法进行DAP脱机烧录踩坑解决总结
  • 市场成本趋势-新指标-找到成本高度集中处布局-抓主升或趋势行情,识别出货还是洗盘
  • (十 四)趣学设计模式 之 策略模式!
  • Mysql-如何理解事务?
  • JDBC 进阶
  • 苏州保洁公司加盟连锁哪家好/seo工作前景如何
  • 企业的门户网站一般用什么做/泉州百度搜索推广
  • 广告联盟网站怎么做/头条权重查询
  • 手机如何建免费网站/搜索引擎营销sem
  • 怎么学做一件完整衣服网站/怎样在百度打广告
  • 做网站的硬件/代刷网站推广链接免费