每天学一点C++ —— 左值右值

📅 2026/8/2 13:18:15
每天学一点C++ —— 左值右值
1.左值是拥有标识的表达式右值是可以被移动的表达式分为纯右值和亡值2.const 左值引用 const T 能绑定左值lvalue、纯右值pvalue、亡值xvalue非模板情景下的普通右值引用T 能绑定纯右值、亡值3.const T 绑定临时对象时会延长临时对象的生命周期原本临时对象的生命周期随着表达式的结束会自动销毁但是被 const 左值引用绑定后这个生命周期随着这个引用对象的结束才结束但是延长生命周期的对象只能是被直接绑定的对象如果是对象成员并不会延长生命周期随着对象销毁对象成员依然会被销毁此时 const T 引用对象还存在但是被绑定的对象却不存在了会发生悬垂引用4.T 只能绑定非 const 左值因为T 默认能通过这个引用对象修改被绑定的对象常量左值不能被修改所以不能绑定若允许绑定纯右值、亡值存在后续引用访问已销毁对象的风险引发未定义行为。5.程序直接产生的临时实体一定是右值纯右值亡值 (xvalue) 归类属于右值但亡值不一定是临时对象。6.亡值并不是一个变量比如string s hellos是左值move(s)这个表达式是亡值属于右值它虽然有内存地址但是语法上不允许取所以属于右值。区分左值和右值的核心就是能否取地址这个是快速判断方法不是规范定义不能取地址并不代表没有内存空间7.不加 const 的临时对象本身允许就地修改调用非 const 成员函数但是语法禁止T绑定临时对象防止后续引用指向已经销毁的临时造成 悬垂引用。8.string s2 move(s)s对象本体分配在栈对象内部存有指向堆内存的指针堆内存存放字符串字符。移动构造时新对象s2复制源对象s的指针、长度等信息让s2内部指针指向原来的堆缓冲区随后将s内部指针置空。堆内存只有一份完成资源所有权转移无需拷贝字符深拷贝就是有两份堆内存。