左值and右值
左值指的是可以取地址的变量,记住,左值与右值的根本区别在于能否获取内存地址,而能否赋值不是区分的依据。通常临时量均为右值。
对于自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。 右值只能被 const reference 指向(右值的生命周期被延长)。
右值就是指在下一个分号(更准确的说是在包含右值的完整表达式的最后)销毁的临时对象。
C++11中新增了一个右值引用。
move
若一同提供复制与移动赋值运算符,则若参数为右值(如无名临时量的纯右值或如 std::move 结果的亡值)则重载决议选择移动赋值,若参数为左值(具名对象、返回左值引用的函数/运算符)则选择复制赋值。若仅提供复制赋值,则所有值类别选择它(只要它以值或到 const 引用接收其参数),这使得移动赋值不可用时,复制赋值成为备选。
//将昂贵的拷贝运算变为转移。
1 string(string&& that) // string&& is an rvalue reference to a string
2 {
3 data