c++11 左值引用和右值引用的用法
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要讲解了"c++11 左值引用和右值引用的用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"c++11 左值引用和右值引用的用法"吧!左值是
千家信息网最后更新 2026年11月04日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安全错误
数据库的锁怎样保障安全
互联网科技有限公司
湖南永感互联网科技有限公司
互联网科技官网
科技类互联网
善班互联网科技
互联网未来科技
极限挑战互联网科技
奇酷互联网络科技公司
广州凡科互联网科技
互联网 视角下的科技创新
万达互联网科技
天下捷融互联网科技
互联网 新科技
贵州叶脉互联网科技有限公司所属行业
互联网5g黑科技有哪些
哈尔滨屹滨互联网科技有限公司
广西互联网科技孵化中心
山东星卡互联网科技有限公司官网
浙南科技城互联网大厦招聘
亚光科技低轨卫星互联网
保险科技 互联网保险
互联网的科技
麻工互联网科技
奔汉互联网科技
互联网科技公司有哪些
汽车互联网创新科技园
开一家科技互联网公司需要多少钱
怎样加入科技互联网
广东工业互联网大赛深圳学泰科技
北京互联网科技类企业分布