跳转至

右值引用和move语义

左值和右值

首先,我们先来了解一些左值(lvalue, location value)和右值(rvalue, read value)的概念。通俗来说,左值可以出现在等号的左边和右边,右值只能出现在等号右边。左值,指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以作为一个左值[1]。即左值是一个表达式,可以通过&操作符来获取其地址。如果一个表达式不是左值,就是右值。

C++中常见的出现右值的情况[2]:

  1. 常量字面量

  2. 函数调用返回的值或对象(左值引用类型除外)

  3. 无名对象

    c++ std::string("abcd"); // 无名对象

左值引用和右值引用

如果一个左值,同时是引用,就称为“左值引用”[3]。非const左值引用,不能用右值对其赋值

std::string& s = std::string("hello");// 会报错
// cannot bind non-const lvalue reference of type ‘std::string&’ {aka ‘std::__cxx11::basic_string<char>&’} to an rvalue of type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’}

std::string& s = std::string("hello"); // 正常

右值引用:必须绑定到右值的引用,其引入主要目的是支持移动操作(实现move语义)[2]。

参考

https://theonegis.github.io/cxx/C-%E7%A7%BB%E5%8A%A8%E8%AF%AD%E4%B9%89%E5%8F%8A%E6%8B%B7%E8%B4%9D%E4%BC%98%E5%8C%96/