c++11 左值引用和右值引用的用法
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要讲解了"c++11 左值引用和右值引用的用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"c++11 左值引用和右值引用的用法"吧!左值是
千家信息网最后更新 2025年12月03日c++11 左值引用和右值引用的用法
这篇文章主要讲解了"c++11 左值引用和右值引用的用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"c++11 左值引用和右值引用的用法"吧!
左值是表达式结束后依然存在的持久对象,既能出现在等号左边也能出现在等号右边的变量或表达式
右值是因为声明结束后会被销毁,所以不能放在等号左边
#includeusing namespace std;void Print(string& s){ cout << s;}int main(){ string s="abc"; Print(s); // OK Print("abc"); // parse error}
&是c++里的左值引用
&&是c11里的右值引用
右值只能被const引用指向,在这时,右值的生命周期被延长了,直到引用销毁。
因为右值只能被const引用指向,所以我们才会在拷贝构造函数和赋值函数形参内加上const(还有一个原因是避免参数被修改),这里c11出现了一个特殊智能指针的non const拷贝构造函数
string Proc() { return string("abc"); } int main() { const string& ref = Proc(); //此时右值的生命周期延长了,直到main函数结束 cout << ref << endl; return 0; }使用std::move()接受一个参数,返回该参数对应的右值引用
templateinline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) { return static_cast ::type&&>(__t); } static_cast是一个强制类型转换符,强制类型转换会告诉编译器:我们知道并且不会在意潜在的精度损失。
//下面有一个move使用的小例子void swap(T& a, T& b) { T tmp = move(a); a = move(b); b = move(tmp); //可以看出相比较之前的进行了多次资源拷贝、销毁的swap //在swap里使用move只是进行了三次的指针交换,效率提升 }forward()接收一个参数,返回该参数本来所对应的类型的引用。(即完美转发)
#include//#include //for std::forwardusing namespace std;void print(const int& t){ cout <<"lvalue" << endl;}void print(int&& t){ cout <<"rvalue" << endl;}template void Test(T&& v) //v是Universal引用{ //不完美转发 print(v); //v具有变量,本身是左值,调用print(int& t) //完美转发 print(std::forward (v)); //按v被初始化时的类型转发(左值或右值) //强制将v转为右值 print(std::move(v)); //将v强制转为右值,调用print(int&& t)}int main(){ cout <<"========Test(1)========" << endl; Test(1); //传入右值 int x = 1; cout <<"========Test(x)========" << endl; Test(x); //传入左值 cout <<"=====Test(std::forward (1)===" << endl; Test(std::forward (1)); //T为int,以右值方式转发1 //Test(std::forward (1)); //T为int&,需转入左值 cout <<"=====Test(std::forward (x))===" << endl; Test(std::forward (x)); //T为int,以右值方式转发x cout <<"=====Test(std::forward (x))===" << endl; Test(std::forward (x)); //T为int,以左值方式转发x return 0;}/*输出结果e:\Study\C++11\16>g++ -std=c++11 test2.cppe:\Study\C++11\16>a.exe========Test(1)========lvaluervaluervalue========Test(x)========lvaluelvaluervalue=====Test(std::forward (1)===lvaluervaluervalue=====Test(std::forward (x))===lvaluervaluervalue=====Test(std::forward (x))===lvaluelvaluervalue*/
感谢各位的阅读,以上就是"c++11 左值引用和右值引用的用法"的内容了,经过本文的学习后,相信大家对c++11 左值引用和右值引用的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
参数
函数
类型
强制
拷贝
方式
等号
学习
内容
变量
周期
指向
指针
生命
表达式
特殊
例子
原因
只是
右边
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
游戏里怎么更改服务器
云顶手游北美服务器是哪个
智能机器人软件开发合同
怎么加密access数据库
网络安全南邮作业答案
积极打造重庆网络安全
无锡编程软件开发公司
江阴工程软件开发产品介绍
美国软件开发中学
启动服务器访问
mac可以下数据库吗
xbox 游戏变更服务器
把前台数据传到后台数据库
加强和改进网络安全工作
软件服务器成本怎么估算
服务器管理中工具不能用
什么是军事网络安全
数据库表散列是什么意思
海康威视家庭网络安全
数据库导入命令impdp
云顶手游北美服务器是哪个
网络安全法约谈制度
数据库备份和还原功能
北京学生网络技术咨询常见问题
软件开发需求采集
宁波象山区惠普机架式服务器
江西农商银行网络安全宣传
网络安全防御概念
网络安全突发事件应急能力
辽宁食品行业进口软件服务器软件