赞
踩
在我们使用移动构造函数的时候,我们会用到move
例如:
MyVector vec2(std::move(vec1));
将我们的vec1从左值强制转换为右值
这里运用到了模板的知识
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 &&,从而完成了左值对于右值的转换。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。