std::move详解

二木 王者

std::move详解

Owner: 二木

在我们使用移动构造函数的时候,我们会用到move

例如:

1
2
 
MyVector vec2(std::move(vec1));

将我们的vec1从左值强制转换为右值

std::move源码

这里运用到了模板的知识

1
2
3
4
5
template <typename T>
typename remove_reference<T>::type&& move(T&& t)
{
return static_case<typename remove_reference<T>::type&&>(t);
}

这里将remove_reference::type&&重命名为了move, 内部返回了

这里使用的是元编程中的类型萃取表达式,remove_reference萃取模板的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
struct remove_reference {
using type = T;
};

template <typename T> //如果传入的值为左值引用,返回传入传入类型的原本类型
struct remove_reference<T&> {
using type = T;
};

template <typename T> //如果传入的值为右值引用,返回传入传入类型的原本类型
struct remove_reference<T&&> {
using type = T;
};

remove_reference这里使用了模板的特化与偏特化,通过传入的类型来命中对应的特化模板,两个特化模板实现的操作都是将传入的引用去除。使得其能够返回我们原来传入的非引用类型。

我们继续看到这个代码

1
2
3
4
5
template <typename T>
typename remove_reference<T>::type&& move(T&& t)
{
return static_case<typename remove_reference<T>::type&&>(t);
}

typename remove_reference<T>::type&& 就是我们的返回值类型,typename的作用是告诉编译器我们这里的remove_reference<T>::type&& 是表示的是一个数据类型

对于static_case 的常用的用法

1
static_case<int>(a) 

这里表示的是将我们的a强制转换为int类型

对于强制转换c++有四种使用发生,下面有个大佬写的总结非常不错。

C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast) (biancheng.net)

static_case<typename remove_reference<T>::type&&>(t) 对于这一句,就是调用我们的一个强制类型准换符static_case 将我们传入的T 强制转换为typename remove_reference<T>::type&& 类型,而我们的typename remove_reference<T>::type 的返回值为就是传入数据的非引用类型,然后加上外面的&& 就变成了 T &&,从而完成了左值对于右值的转换。

 评论