指针 引用特性引用 (Reference)指针 (Pointer)本质变量的别名语法糖底层通常就是指针实现存储内存地址的独立变量初始化必须在定义时初始化绑定对象定义时可以不初始化但建议初始化为nullptr绑定关系绑定关系不可变更终身绑定到初次初始化的对象可以随时修改指向新的内存地址空值安全性语法上不能为 null始终假设绑定有效对象可以为nullptr使用前必须判空如if(p)语法与解引用自动隐式解引用直接像普通变量一样使用必须通过*p或p-显式解引用访问内存占用局部位优化为 0 开销作为参数/成员时占 4/8 字节占用固定的指针尺寸32位系统占 4 字节64位系统占 8 字节悬垂风险无空指针风险但若绑定的对象提前析构依然会产生悬垂引用存在空指针、野指针以及悬垂指针风险典型用途函数参数传递避免拷贝且语法简洁、运算符重载动态内存管理new/delete、多级指针、可选参数传nullptr表示无值引用的绑定关系指向不可改变”但“被引用对象内部的值”是可以修改的除非是const引用左值右值当一个右值被绑定到右值引用形参T arg上时在函数内部这个形参arg自身就变成了左值左值Lvalue有变量名、生命周期持久可以通过 获取内存地址如变量名、解引用 *p、返回引用的函数右值Rvalue无变量名、临时存在即将销毁无法直接取地址如字面量 42、临时对象 std::string(“a”)、返回非引用的函数inta10;// a 是左值intx1020;// 10 20 是右值std::string shello;// hello 是右值左值引用 右值引用特性左值引用 (T)右值引用 (T)绑定对象只能绑定左值const T除外可绑右值只能绑定右值临时对象、std::move的返回值核心用途避免函数传参/返回时的深拷贝资源窃取移动语义与完美转发内存与身份绑定后继续作为左值使用绑定的形参在函数内部会变成左值因为有了名字典型示例int a 10; int ref a;int rref 42;右值引用的使用移动语义偷取资源std::vectorint v1 {1, 2, 3}; // std::move(v1) 将 v1 强转为右值触发 vector 的移动构造函数 std::vectorint v2 std::move(v1); // v2 偷走 v1 的堆内存0 拷贝完美转发保持原始属性templatetypename T void wrapper(T arg) { // T 此时是万能引用Universal Reference // std::forward 确保传入的是右值就按右值转发左值就按左值转发 target(std::forwardT(arg)); }
