c++的移动赋值操作
一些背景知识
了解c++的左值和右值
一句话描述:
-
左值 (lvalue, locator value) 表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象。
-
右值 (rvalue) 则使用排除法来定义。一个表达式不是 左值 就是 右值 。 那么,右值是一个 不
表示内存中某个可识别位置的对象的表达式。
深度理解可以参考该链接:https://nettee.github.io/posts/2018/Understanding-lvalues-and-rvalues-in-C-and-C/
c++11的折叠引用
c++11可以使用左值引用,type &引用名 = 左值表达式;以及右值引用,type &&引用名 = 右值表达式;
c++11特性-折叠引用原理:
- 右值引用与右值引用折叠为右值引用,也即X&& &&折叠成X&&,用于处理右值
- 其他情况下,折叠为左值引用,也即X& &、X&& &、X& &&都折叠成X&,用于处理左值
remove_reference
remove_reference的作用是去掉了类型的左值引用和右值引用,直接返回类型的基本内容。
remove_reference
的源码
template<typename _Tp>
struct remove_reference
{
typedef _Tp type; };
template<typename _Tp>
struct remove_reference<_Tp&>
{
typedef _Tp type; };
template<typename _Tp>
struct remove_reference < _Tp&& >
{
typedef _Tp type; };
也就是说,remove_reference 实际上是封装了一个模板类,根据传入的类型匹配对应的数据结构体,而remove_reference::type总能返回类型的基本内容。
static_cast
任何具有明确定义的类型转换,但static_cast 也不能用来去掉表达式的 const 修饰和 volatile 修饰。换句话说,不能将 const/volatile 类型转换为非 const/volatile 类型。