简单理解 =号左边就是左值 =号右边就是右值
左值就是普通的变量或者表达式 右值一般就是函数中返回的临时变量,或者常量 或者 const 引用类型
重点是右值引用 &&
基础形式
int&& a = 10
- 应用方向
- 移动语义
主要用在拷贝构造函数中,如果类中使用了指针类的变量需要拷贝,如果编译器没有优化的话,就会经历重新申请空间,赋值,释放旧空间的操作步骤,
如果使用的右值引用,那么就会直接将旧的指针赋值给新的目标
class Base
{
Base(const Base& other)
{
cout<<"default construct function" <<endl;
}
Base(Base&& other)
{
cout << "rvalue construct" << endl;
}
}
Base GetClass()
{
return Base()
}
int main()
{
Base b = GetClass(); //这里GetClass就是返回的右值,如果在GCC下会输出rvalue construct,vs会自动进行代码优化
Base c = std::move(b); //这里move的作用就是将左值转换为右值
return 0;
}
- 完美转发
作用是为了适配各种传入的类型,主要用在模板中
void Print1(int& i)
{
cout << "print left value" << endl;
}
void Print1(const int& j)
{
cout << "print right value" << endl;
}
template <typename T>
void Fun(T&& param) //这里注意传入的参数类型为右值引用,如果传入的是左值 或者左值引用的话 那么按照折叠规则会转变为T&
//如果传入的是右值或者右值引用,那么会变成T&&类型
{
Print1(std::forward<T>(param)); //这里注意使用了forward函数 如果不使用的话 不过param是什么类型 在print1中都会默认为左值类型,forward的作用就是保持住param的类型
}
int main() {
int i = 3;
Fun(i);
Fun(5);
system("pause");
return 0;
}