左值是指在内存中有确定位置并且可以被取地址的表达式,它通常指代一个具有持久性(Permanent)和唯一性(Identity)的对象 右值是指表示值的表达式,它通常是一个临时的、没有持久性和唯一性的对象或字面值常量 右值分为:纯右值(字面常量)和将亡值(更侧重于自定义类型的函数的返回值,表达式的返回值)。
当构造传左值,就走拷贝构造,当构造传右值,就走移动构造。
对于左值,我们后续还要使用,所以只能进行深拷贝,完成拷贝构造。
但对于右值(将亡值),可以直接进行资源的交换,将this和将亡值交换资源。
右值引用主要用于以下两个目的:
转移语义(Move Semantics): 右值引用允许我们将资源(如动态分配内存、文件句柄等)从一个对象转移到另一个对象,而无需进行深拷贝。这通过在拷贝构造函数和赋值运算符中定义右值引用参数来实现。转移语义可以提高性能并减少不必要的内存分配和复制操作。
完美转发(Perfect Forwarding): 右值引用还使得函数能够接受任意类型的参数,并将其转发给其他函数,同时保持原始参数的值类别(左值或右值)。这在泛型编程和模板函数中特别有用
在需要的场景使用移动语义代替拷贝语义; 模板编程中,如果需要透传参数,那么需要使用完美转发。