简单理解 =号左边就是左值 =号右边就是右值
    左值就是普通的变量或者表达式 右值一般就是函数中返回的临时变量,或者常量 或者 const 引用类型
    重点是右值引用 &&
    基础形式
    int&& a = 10

    • 应用方向
    1. 移动语义

    主要用在拷贝构造函数中,如果类中使用了指针类的变量需要拷贝,如果编译器没有优化的话,就会经历重新申请空间,赋值,释放旧空间的操作步骤,
    如果使用的右值引用,那么就会直接将旧的指针赋值给新的目标

    1. class Base
    2. {
    3. Base(const Base& other)
    4. {
    5. cout<<"default construct function" <<endl;
    6. }
    7. Base(Base&& other)
    8. {
    9. cout << "rvalue construct" << endl;
    10. }
    11. }
    12. Base GetClass()
    13. {
    14. return Base()
    15. }
    16. int main()
    17. {
    18. Base b = GetClass(); //这里GetClass就是返回的右值,如果在GCC下会输出rvalue construct,vs会自动进行代码优化
    19. Base c = std::move(b); //这里move的作用就是将左值转换为右值
    20. return 0
    21. }
    1. 完美转发

    作用是为了适配各种传入的类型,主要用在模板中

    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;
    }