右值目前
一、右值
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
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