左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。无论是左值引用还是右值引用都是左值(声明出来的左右值都有地址)
引用的本质是别名,可以通过引用修改变量的值,传参时传引用可以避免拷贝,和指针类似
右值引用的标志是 &&
int a = 5;
int &&ref_a_left = a; // error 右值引用不可以指向左值
int &&ref_a_right = 5; // ok
右值引用可以通过move()指向左值,把左值强制转换成右值
int &&ref_a_right = std::move(a); // ok
std::forward
当右值引用作为函数的形参时,在函数内部转发该参数给内部其他函数时,就会变成一个左值,这时候就可以用到完美转发了
std::forawrd<T>(t);
当T为左值引用类型时,t将被转换为T类型的左值
当T不是左值引用类型时,t将被转换为T类型的右值
如果是模板参数需要指定为T&&,如果是自动类型推导需要指定为auto &&,在这两种场景下 &&被称作未定的引用类型。而不是右值引用