右值和forward

看实例 http://www.wjhsh.net/KillerAery-p-12802771.html

主要处理深拷贝问题。。

 

一、右值

复制代码
1int&& b = 6; //这个时候只能右值引用

2、
template<typename T>
void printValue( T&& t)
{
    cout << "r-value: " << t << endl;
    //t = 0; 会出错
}
函数里面的T&& ,即可也接收左值也可以接收右值,除非被重写,就是再定义一个T&的
3
template<typename T>
void printValue(const T&& t) //这个时候只能接收右值 ,连const的左值也不行;与容器的const类似
{
    cout << "r-value: " << t << endl;
    t = 0;
}
复制代码

二、完美转发
就是再传参时,还能是右值
forward的由来:保持住参数的右值属性。

模板函数中的推导类型,作为另一函数的参数时,不管实参是什么类型,作为另一个参数的实参时,都变成了左值。
因为C++里规定函数的形参就是左值,不管调用侧的实参是否是右值。
https://www.cnblogs.com/xiaoshiwang/p/9589008.html

三move重要

move的本质就是帮助编译器选择重载函数, 告诉编译器"请尽量把此参数当做右值来处理"

但是要清楚机制的时机,主要是拷贝构造函数的时候

void testfun(HasPtrMem a){};

void main(){
    HasPtrMem a;
    testfun(a);  //调用拷贝构造函数
    testfun(std::move(a));//调用移动构造函数
}

 但是感觉通过传引用更好啊
void testfun1(HasPtrMem& a){};
testfun1(a);

posted @   cnchengv  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示