C++ 专题 右值引用、移动语义与完美转发

这三个概念都是c++11引入的概念,在此总结一些粗浅的理解。c++

右值与左值

  • 右值是什么(左值)
    应该在c++98就有左右值的概念吧(不肯定我也懒得调研啊)。
    所谓左值右值,左值取址(地址),右值取值(数值)
    Lvalue = expressions of which we can get memory address
    Rvalues = expressions of which we can't get memory address
    左值refer to 内存中的某一具名对象,好比变量、函数参数、类对象
    右值主要是临时对象,好比literals(字面值)、操做的临时结果(a+b), 函数非引用返回的临时对象,匿名对象...
  • 为何要有右值
    如下内容来自某乎某高赞答案,为防止失效,除了连接直接把原文也抄了过来

但是实现上为了即使是右值表达式为了求出其值依然须要分配一块内存来存放这个值,这造成了一个临时对象,即便以后没有给这个对象取名,对象依然造成了,依然经历了构造和析构的完整生命周期。
这是C++支持RAII以后的事情了。并且即使如今基本类型的右值表达式并不须要事先分配内存。
左右并不是是C/C++才开始有的,而是当前计算机体系结构的客观现实。原本,左值是内存上的变量(有地址),右值是只在寄存器当中存在的值(没有地址)。
这样就好理解了吧。只不过有告终构体和对象概念以后,单个数据类型也可能大到没法完整存放在寄存器当中,须要在栈或者堆(反正都是内存)上开额外空间临时存放。再加上RAII的要求,因此才把事情搞那么绕,那么复杂。
其实若把这个临时空间(scratch memory)看做寄存器的扩展,不属于常规内存,那么就好理解了。事实上C++从语法规定上禁止对右值取地址,即使它在内存上有位置。这就是告诉你,这片内存并非一般的内存,逻辑上它只是超大寄存器。
https://www.zhihu.com/questio...express

右值引用(与左值引用)

ok,右值能够理解,那右值引用是什么鬼?为何要refer一块在内存上可是无法取地址访问的东西。
c++98中的引用很常见了,就是给变量取了个别名,咱们能够经过解引用获取到变量(对象),实际上这具体指的是左值引用函数

相关文章
相关标签/搜索