博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Primer 笔记——理解std::move
阅读量:6827 次
发布时间:2019-06-26

本文共 868 字,大约阅读时间需要 2 分钟。

hot3.png

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

template 
typename remove_reference
::type&& move(T&& t){ return static_cast
::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显示的将一个左值转换为一个右值。

转载于:https://my.oschina.net/u/4000302/blog/3024266

你可能感兴趣的文章
tp框架之对列表的一系列操作及跳转页面(详细步骤)
查看>>
数据库编程:检测TabName 数据表是否存在
查看>>
使用string.Format需要注意的一个性能问题
查看>>
手把手教小白安装Erlang
查看>>
logging模块
查看>>
oracle中Window和Window Group
查看>>
SQL语句的执行过程
查看>>
hdu 1540 Tunnel Warfare
查看>>
装机必备工具
查看>>
Block
查看>>
查看.NET程序集编译类型命令corflags
查看>>
每天一个linux命令(16):witch命令
查看>>
使用Guava进行函数式编程
查看>>
「记录」安装Arch Linux的过程步骤
查看>>
SQL Sever数据库语法介绍及相关例子
查看>>
一步步学Qt,第五天-小小的ClippingDemo
查看>>
__FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)(转)
查看>>
ASCII字符集
查看>>
如何用Axure快速制作APP交互原型
查看>>
微软正式开源Blazor,将.NET带回到浏览器
查看>>