move获得一个绑定到左值上的右值引用
1. 如何定义
template<typename T>
typename remove_reference<T>::type&& move(T&& t)
{
return static_cast<typename remove_reference<T>::type&&>(t);
}
2. 工作机制
(1)对于std::move(string &&t);
推断出T为string
->>remove_reference<string>的type成员为string
->>move的返回类型为string&&
->>函数参数t的类型为string&&
即调用实例化,string&& move(string &&t);
(2)string s1("hi");
std::move(s1);
推断出T为string&->>remove_reference<string&> 的type成员为string->>move的返回类型为string&&->>move的函数参数t实例化为string&&&,折叠为string&
调用实例化string&& move(string &t);
3. 从左值static_cast到右值引用
强制类型转换可以防止意外进行转换
习题16.46:
解释下列循环
for(size_t i=0;i!=size();i++)
alloc.construct(dest++,std::move(dest++,std::move(*elem++);
在dest位置处加入elem++右引用。