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

左值引用、右值引用、万能引用

左值引用和右值引用

例1

#include <iostream>using namespace std;void f1(int& a){cout << "f1: " << a <<endl;
}int main(){int a =8;f1( a ); // complie f1( 5 ); // can't compliereturn 0;
}

非常简单的代码, 函数 void f1(int& ) 需要的一个参数是一个引用, 但是 f1(a) 编译器可以通过, f1(5) 编译器不能通过,因为后者就是一个右值(具体左值和右值是什么可以在网上找,其实很容易理解,我们现在的重点是为什么会出现右值引用这个东西)。 对于一个常数,没有分配内存空间,自然就不能有地址,那么引用是需要对方的地址的,那么就不通过。

其实这是因为引用太方便了,相比于指针,我们可以看这个:

例2

#include <iostream>using namespace std;void f1(int* a){cout << "f1: " << *a <<endl;
}int main(){int a =8;f1( &a ); // can complie f1( (int*)5 ); // can compliereturn 0;
}

这个例子里面的函数void f1(int* a)就是使用指针作为参数传递,因为指针接收的是地址,那么如果接收的是一个右值5, 可以通过强制类型转换把 这个5当成一个地址,那么函数实际上根据这个地址找对应的变量, 因此可以通过编译,或者骗过编译器! 不过这么做很危险,只是举个例子,因为 5 这个其实并不是某个合法的变量地址,所有会导致非法内存访问,程序崩溃。

通过 例1例2 就可以知道了,因为引用相当于是直接传递某一个变量而不是地址, 当然有时候也希望传递一个常量,假设这个函数就是利用这个值而不是改变它的话。

那么 如何能引用右值呢?
方法1: 采用 “const + 引用”的方式,即 void f1(const int& a), 不过这意味着在这个函数的生命期内无法改变该引用的值。
方法2:采用右值引用 void f1(int&& a),这样就不可以左值引用。
方法3:采用 “函数模版+万用引用”,什么意思呢? 就是C++里面有 万用引用,就是既可以支持左值也可以支持右值,不过这个原理是通过C++ 特有的特性函数模板来推导: 如例3 所示:

例3

#include <iostream>using namespace std;template<typename T>
void f1( T&& a){cout << "f1: " << a <<endl;
}int main(){int a =8;f1( a ); // can complie and run f1( 5 ); // can complie and runreturn 0;
}
http://www.dtcms.com/a/415021.html

相关文章:

  • TrendFinder - 社交媒体趋势追踪工具
  • 【QT第一章】QT基础知识
  • 网站开发亿玛酷技术河南营销推广软件
  • 操作系统经典PV操作——读者-写者问题的公平性实现
  • 商业机构的网站是什么酒店网站模板设计方案
  • 【SpringAI中Chat-Client用法】
  • Python 数学公式构建海洋不明生物(好像是水母)动画 - 简谐振动
  • 宁波市江北区建设局网站上海php网站开发
  • Linux面试题及详细答案 120道(61-75)-- 文件系统与存储
  • 韶关住房和城乡建设局网站气血不足做网站
  • 橱柜网站建设公司建设网站的收费
  • 融资路演 AI 速成 72 小时实战指南(抓风口→做PPT→补漏洞)
  • JUC并发编程:共享模型之管程与悲观锁(synchronized)详解
  • php基础-文件包含(第13天)
  • STM32智能加湿器
  • 网站开发管理nodejs网站开发教程
  • webrtc弱网-TrendlineEstimator类源码分析与算法原理
  • RocketMQ 消息堆积:快速定位、处理与预防方案
  • 深圳网站建设制作开发咨询邯郸网站建设
  • P3051题解
  • 想给孩子找点题做 都有什么网站化学课件
  • 【2026计算机毕业设计】基于Springboot的汉服交流的微信小程序
  • uutils coreutils - GNU coreutils 的 Rust 跨平台实现
  • 如何在阿里巴巴上做网站去哪网站备案吗
  • 软考中级-软件设计师(五)
  • 零基础学Docker(5)--容器数据卷
  • list列表
  • 团购网站做摄影网站编程开发
  • Kurt-Blender零基础教程:第4章:粒子篇
  • Qt常用控件之QTextEdit