c++11 左值引用和右值引用的用法
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要讲解了"c++11 左值引用和右值引用的用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"c++11 左值引用和右值引用的用法"吧!左值是
千家信息网最后更新 2025年02月08日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安全错误
数据库的锁怎样保障安全
服务器主板详细图解
服务器怎样创建超级用户
戴尔台式服务器电脑
java生产者消费者数据库
网络安全特征照片
软件开发拼音怎么拼
talnet默认的服务器端口是
软件开发可以计入在建工程
魔兽台服暗影之月服务器
好用的国外网络安全网站
益阳网络安全工程师招聘
网络安全的三年级手抄报
互联网医疗科技有限公司刘翔
饥荒联机版启动服务器出问题
华材计算机网络技术分数
徐汇区网络软件开发销售电话
网络安全产品正处于什么阶段
mysql数据库开启事务
数据库开发技术介绍ppt
中职高考计算机数据库
暗潮下载软件开发
泓途网络技术
怀旧服服务器锁定怎么解锁
鹤峰数据库修复
图书管理系统的数据库
东莞微科网络技术公司
sql定义数据库的逻辑结构
数据库和gis
ifix组态软件开发使用
网络安全创新示范区