当前位置:   article > 正文

std::move详解_sdt::move

sdt::move

std::move详解

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

例如:

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

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

std::move源码

这里运用到了模板的知识

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

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

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

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;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

我们继续看到这个代码

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

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

对于static_case 的常用的用法

static_case<int>(a) 
  • 1

这里表示的是将我们的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 &&,从而完成了左值对于右值的转换。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/640080
推荐阅读
相关标签
  

闽ICP备14008679号