码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer 笔记——理解std::move

时间:2017-08-27 17:07:03      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:string   bsp   实例化   typename   color   笔记   过程   数据   使用   

标准库move函数是使用右值引用的模板的一个很好的例子。标准库是这样定义std::move的:

template <typename T>
typename remove_reference<T>::type&& move(T&& t)
{
    return static_cast<typename remove_reference<T>::type&&>(t);
}

 

我们考虑如下代码的工作过程:

std::string s1("hi"), s2;
s2 = std::move(string("hi"));    // 正确,从一个右值移动数据
s2 = std::move(s1);                // 正确,但是在赋值之后,s1的值是不确定的


在第一个赋值中,实参是string类型的右值,因此过程为:

  • 推断T的类型为 string
  • remove_reference<string> 的 type 成员是 string
  • move 返回类型是 string&&
  • move 的函数参数t的类型为 string&&

因此,这个调用实例化 move<string>,即函数

string&& move(string &&t)


在第二个赋值中,实参是一个左值,因此:

  • 推断T的类型为 string&
  • remove_reference<string&> 的 type 成员是 string
  • move 返回类型是 string&&
  • move 的函数参数t的类型为 string& &&,会折叠成 string&

因此,这个调用实例化 move<string&>,即

string&& move(string &t)

 

  通常情况下,static_cast 只能用于其他合法的类型转换。但是有一条针对右值的特许规则:虽然不能隐式的将一个左值转换成右值引用,但我们可以用static_cast显示的将一个左值转换为一个右值。

 

C++ Primer 笔记——理解std::move

标签:string   bsp   实例化   typename   color   笔记   过程   数据   使用   

原文地址:http://www.cnblogs.com/zoneofmine/p/7440577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!