码迷,mamicode.com
首页 > 其他好文 > 详细

std::move的理解

时间:2021-04-08 13:54:15      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:一个   返回   推断   实例化   return   构造   函数参数传递   static   通过   

std::move 的定义

template <typename T>
// typename表明type是一个类型
typename remove_reference<T>::type&& move(T&& t)
{
    return static_cast<typename remove_reference<T>::type&&>(t);
}

首先,move函数参数T&&是一个指向模板类型参数的右值引用.通过折叠,此参数可以与任意类型的实参匹配.特别是,我们既可以传递给move一个左值,也可以传递给它一个右值:

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

std::move 如何工作

在第一个赋值中,传递给move的实参为string的构造函数的右值结果.当向一个右值引用函数参数传递一个右值时,由实参推断出的类型为被引用的类型.因此,在std::move(string("bye!"))中:

  • 推断出T的类型为string
  • remove_referencestring进行初始化
  • remove_reference<string>type成员是string
  • move的返回类型是string&&
  • move的函数参数t的类型为string&&

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

string&& move(string &&t)

函数体返回static_cast<string&&>(t).t的类型已经是string&&,于是类型转化什么都不做.因此,调用的结果就是它所接受的右值引用.

考虑第二个赋值,它调用std::move().此调用中,传递给move的是一个左值.这样:

  • 推断出T的类型为string&
  • remove_referencestring&进行初始化
  • remove_reference<string&>type成员是string
  • move的返回类型是string&&
  • move的函数参数t实例化string& &&,折叠成string&

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

string&& move(string &t)

函数体返回static_cast<string&&>(t).t的类型是string&,cast将其转化为string&&.

std::move的理解

标签:一个   返回   推断   实例化   return   构造   函数参数传递   static   通过   

原文地址:https://www.cnblogs.com/phr2000/p/14630327.html

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