std::move详解

std::move详解

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

例如:

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

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

std::move源码

这里运用到了模板的知识

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萃取模板的源码

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

我们继续看到这个代码

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 的常用的用法

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 &&,从而完成了左值对于右值的转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值