找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3470|回复: 0

左值和右值必知必会

[复制链接]

307

主题

228

回帖

7349

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5599 个
贡献
253 次
宅之契约
0 份
在线时间
949 小时
注册时间
2014-1-25
发表于 2014-11-18 11:48:19 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
1.概念的提出
   左值和右值是现代C++中极为重要的概念,C++11标准第一次明确提出概念。所有C++表达式结果不是左值就是右值,左值是有固定存储位置的变量,对于内存变量是有固定的内存地址,对寄存器变量是有固定的寄存器,专门用于存储该变量,这种变量出现在复制操作符左边;右值是“匿名”或“临时”变量,在表达式结束时生命周期终止,没有固定的存储位置,因此不能用取地址操作符“&”获取地址,否则会在编译期发生错误。例如int x=0,则x++是右值,++x是左值。
2.为什么引入左值右值
   左值是一切定义的变量,如果没有左值将无法进行编程;而右值是编译器在识别表达式时,将多个左值进行计算得到一个新的左值(也可能不要左值结果)而必须内部生成的临时变量,用于存储中间结果,这个变量可能存在于还没有划分的函数变量栈空间或更好的方式:寄存器。这是在底层,在高级语言层,就节省了定义多个左值变量语句。不过右值的引入,同时可能降低运行效率,如果左值是对象,那么右值也是对象,在进行左值<==>右值相互转换时,会发生多次拷贝构造,而如果把某些特定位置,例如返回类型或参数类型,左值类型改成接收右值,就可以节省左值到右值的相互拷贝,不过多地生成中间对象,为此C++11提出了右值引用T&&和move函数。
template<class T>
typename remove_reference<T>::type&& move(T&& t) noexcept;
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-6 12:40 , Processed in 0.036047 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表