右值目前


一、右值

1、
int&& b = 6; //这个时候只能右值引用

2、
template
void printValue( T&& t)
{
    cout << "r-value: " << t << endl;
    t = 0;
}
函数里面的T&& ,即可也接收左值也可以接收右值,除非被重写
3
template
void printValue(const T&& t) //这个时候只能接收右值
{
    cout << "r-value: " << t << endl;
    t = 0;
}

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

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

move 转换为右值引用,forward右值转发出去


三move重要

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

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


void testfun(HasPtrMem a){};

void main(){
    HasPtrMem a;
    testfun(a);  //调用拷贝构造函数
    testfun(std::move(a));//调用移动构造函数
}
所以开源项目中 move使用非常多
但是感觉通过传引用更好啊
void testfun1(HasPtrMem& a){};
testfun1(a);


已结
https://www.cnblogs.com/cnchengv/p/15811578.html