每天学一点C++ —— 左值右值
2026/8/2 13:18:06 网站建设 项目流程

1.左值是拥有标识的表达式;右值是可以被移动的表达式,分为纯右值和亡值

2.const 左值引用 :const T & 能绑定左值(lvalue)、纯右值(pvalue)、亡值(xvalue);非模板情景下的普通右值引用:T&& 能绑定纯右值、亡值

3.const T & 绑定临时对象时会延长临时对象的生命周期,原本临时对象的生命周期随着表达式的结束会自动销毁,但是被 const 左值引用绑定后这个生命周期随着这个引用对象的结束才结束;但是延长生命周期的对象只能是被直接绑定的对象,如果是对象成员,并不会延长生命周期,随着对象销毁,对象成员依然会被销毁,此时 const T & 引用对象还存在,但是被绑定的对象却不存在了,会发生悬垂引用;

4.T &只能绑定非 const 左值,因为T &默认能通过这个引用对象修改被绑定的对象,常量左值不能被修改,所以不能绑定;若允许绑定纯右值、亡值,存在后续引用访问已销毁对象的风险,引发未定义行为。

5.程序直接产生的临时实体一定是右值(纯右值);亡值 (xvalue) 归类属于右值,但亡值不一定是临时对象。

6.亡值并不是一个变量,比如string s = "hello";s是左值,move(s)这个表达式是亡值,属于右值,它虽然有内存地址,但是语法上不允许取&,所以属于右值。(区分左值和右值的核心就是能否取地址(这个是快速判断方法不是规范定义),不能取地址并不代表没有内存空间!)

7.不加 const 的临时对象本身允许就地修改(调用非 const 成员函数);但是语法禁止T&绑定临时对象,防止后续引用指向已经销毁的临时,造成 悬垂引用。

8.string s2 = move(s);s对象本体分配在栈,对象内部存有指向堆内存的指针,堆内存存放字符串字符。

移动构造时,新对象s2复制源对象s的指针、长度等信息,让s2内部指针指向原来的堆缓冲区;随后将s内部指针置空。堆内存只有一份,完成资源所有权转移,无需拷贝字符(深拷贝就是有两份堆内存)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询