函数模板参数左值,右值,引用
发布日期:2021-06-30 12:10:52
浏览次数:3
分类:技术文章
本文共 2598 字,大约阅读时间需要 8 分钟。
#include#include using namespace std;template void valTest(T t) { cout << "void valTest(T t)" << endl; t++; cout << "t = " << t << endl;}template void refTest(T& t) { cout << "void refTest(T& t)" << endl; t++; cout << "t = " << t << endl;}template void moveTest(T&& t) { cout << "void moveTest(T&& t)" << endl; t++; cout << "t = " << t << endl;}//总结://(1)模板参数(T t);传参时ref()的是原本,其余都是副本//(2)模板里自带引用(T& t)或者(T&& t),无论传参的是左值还是右值,其作用都在原值上//变量、左值引用、右值引用原则上不能冲突(模板可以,没有那么严格)//ref 变量-》左值引用//mov 左值—》右值(避免拷贝)int main() { int data = 100; valTest(ref(data)); // ref引用传参 cout << "data = " << data << endl; // 101 cout << "===========" << endl; //data = 101 int &&rrdata = data + 1; //rrdata = 102 valTest(rrdata); cout << "rrdata = " << rrdata << endl; // 102 cout << "data = " << data << endl; // data =101 cout << "===========" << endl; refTest(rrdata); // rrdata = 102 cout << "rrdata = " << rrdata << endl; // 103 cout << "data = " << data << endl; // data =101 cout << "===========" << endl; moveTest(/*reinterpret_cast */(rrdata)); // rrdata = 103 cout << "rrdata = " << rrdata << endl; // 104 cout << "data = " << data << endl; // data =101 cout << "===========" << endl; return 0;}int main2() { int data = 100; int &rdata = data; valTest(rdata); cout << "rdata = " << rdata << endl; // rdata = 100 cout << "data = " << data << endl; // data = 100 cout << "===========" << endl; refTest(rdata); // rdata = 100 cout << "rdata = " << rdata << endl; // rdata = 101 cout << "data = " << data << endl; // rdata = 101 cout << "===========" << endl; moveTest(/*reinterpret_cast */(rdata)); //rdata = 101 cout << "rdata = " << rdata << endl; // rdata = 102 cout << "data = " << data << endl; // data = 102 cout << "===========" << endl; //模板并没有那么严格,如果是自定义函数则无法通过编译,则需要使用move()把数据、左值引用变为右值引用// moveTest(move(rdata));// cout << "rdata = " << rdata << endl; // 103// cout << "===========" << endl; return 0;}int main1() { int data = 100; valTest(data); cout << "data = " << data << endl; // 100 cout << "===========" << endl; refTest(data); cout << "data = " << data << endl; // 101 cout << "===========" << endl; moveTest(/*reinterpret_cast */(data)); cout << "data = " << data << endl; // 102 cout << "===========" << endl; return 0;}
std::ref 用于包装按引用传递的值。
std::cref 用于包装按const引用传递的。std::move并不能移动任何内存,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义,从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
转载地址:https://jadeshu.blog.csdn.net/article/details/107227949 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年05月02日 12时24分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
nginx 配置 使jsp页面转向tomcat处理
2019-04-30
使用分区助手扩大系统盘容量
2019-04-30
远程桌面提示此计算机无法连接到远程计算机该怎么办
2019-04-30
linux下安装mongodb
2019-04-30
Mongodb如何开启用户访问控制详解
2019-04-30
MongoDb的更新操作
2019-04-30
SQL truncate 、delete与drop区别
2019-04-30
Spring form标签示例
2019-04-30
自定义Shiro标签Tag
2019-04-30
org.apache.commons.lang3功能示例
2019-04-30
Sqlplus里如何调用Shell脚本?待整理
2019-04-30
Crawler4j快速入门实例
2021-07-03
display:inline、block、inline-block的区别
2021-07-03
java.sql.SQLException:ORA-01861:文字和格式字符串不匹配
2021-07-03
Webuploader图片上传控件的使用,项目中都可以引用
2021-07-03
ajax请求导致status为canceled的原因
2021-07-03