1. 标准库定义

/ / 在返回类型和类型转换中也要用到 typename, 参见 16.1.3 节( 第 593 页 )
reference 是在 16.2.3 节( 第 605 页 ) 中介绍的
template typename remove reference::type&& move (T && t )
{
// static_cast 是在 4.11.3 节( 第 145 页 ) 中介绍的
return static_cast<typename remove reference::type&&> (t);
}

move 的函数参数 T &&是一个指向模板类型参数的右值引用。 通过引用折叠, 此参数可以与任何类型的实参匹配。 特别是, 我们既可传递给 move—个左值, 也可以传递给它一个右值
string si (“hi!”), s2;
s2=std::move (string (“bye!” ) ); // 正确: 从一个右值移动数据
s2=std::move(si); // 正确: 但在赋值之后 , si 的值是不确定的

1.1 s2=std::move (string (“bye!” ) );

  • 推断出 T 的类型为 string。
  • remove_reference 用 string 进行实例化。
  • reference type 成员是 string。
  • move返回类型是 string&&。
  • move的函数参数 t 的类型为 string& &。

因此, 这个调用实例化 move, 即函数string && move (string &&t )

1.2 s2=std::move(si);

  • 推断出T的类型为 string& (string 的引用, 而非普通 string)。
  • remove—reference 用 string&进行实例化。
  • remove_reference<string&>的 type 成员是 string。
  • move的返冋类型仍是 string& &。
  • move的函数参数 t 实例化为 string& & & , 会折叠为 string&。

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

从一个左值 static_cast 到一个右值引用是允许的

  • 通常情况下, static_cast 只能用于其他合法的类型转换( 参见 4.11.3 节, 第 145页)。 但是, 这里又有一条 对右值引用的特许规则: 虽然不能隐式地将一个左值转换为右值引用, 但我们可以用 static_cast 显式地将一个左值转换为一个右值引用。

  • 对于操作右值引用的代码来说, 将一个右值引用绑定到一个左值的特性允许它们截断左值。 有时候, 例如在我们的 StrVec 类的 reallocate 函数( 参见 13.6.1 节, 第 469页) 中, 我们知道截断一个左值是安全的。 一方面, 通过允许进行这样的转换, C++语言认可了这种用法。 但另一方面, 通过强制使用 static_cast, C++语言试图阻止我们意外地进行这种转换。

最后, 虽然我们可以直接编写这种类型转换代码, 但使用标准库 move 函数是容易得多的方式。 而且, 统一使用 std::move 使得我们在程序中查找潜在的截断左值的代码变得很容易

C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move相关推荐

  1. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化

    1. 类模板的部分特例化(partial specialization) 类模板的特例化不必为所有模板参数提供实参(可以只指定一部分而非所有模板参数, 或是参数的一部分而非全部特性).类模板的部分特例 ...

  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义

    1. 定义 类似函数模板,类模板以关键字template开始,后跟模板参数列表.在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值: template < ...

  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)效率与灵活性

    1. 标准库智能指针类型 shared_ptr 和 unique_ptr shared_ptr unique_ptr 管理所保存的指针的策略 共享指针所有权 独占指针 用户重载默认删除器的方式 在运行 ...

  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化

    1. 定义一个特例化版本, 模板参数为 Sales data // 打开std 命名空间, 以便特例化 std::hash namespace std {template struct hash< ...

  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化

    1. 场景 //第一个版本:可以比较任意两个类型 template <typename T> int compare (const T &, const T & );//第 ...

  6. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包

    1. 使用可变参数模板与 forward 机制来编写函数, 实现将其实参不变地传递给其他函数(保持实参的原始类型) 1.1 eg class StrVec {public:template <c ...

  7. C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展

    1. 扩展 ( expand) 扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表. 通过在模式右边放一个省略号(-)来触发扩展操作.当扩展一个包时,我们还要提供用于每个扩展 ...

  8. C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板

    1. 可变参数模板( variadic template) 一个接受可变数目参数的模板函数或模板类. 1.1 参数包 (parameter packet) 可变数目的参数被称为参数包,存在两种参数包: ...

  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载模板和类型转换

    1. C 风格字符串指针和字符串字面常量 cout « debug_rep ("hi world!" ) << endl; / / 调用 debug_rep (T* ) ...

最新文章

  1. LeetCode简单题之判断矩阵经轮转后是否一致
  2. 4-类和结构体和可选类型
  3. MySQL数据库语句总结
  4. 使用linux内核编译独立系统,编译linux内核以及depmod的使用
  5. 国际C语言混乱代码大赛结果公布
  6. SpringBoot中注入ApplicationContext对象的三种方式
  7. fastjson jsonobject 转bean失败_FastJson是如何导致App Crash的
  8. DE25 Homogeneous Linear Systems with Constant Coefficients
  9. redis php高级使用_项目中应用Redis+Php的场景
  10. python怎么重新运行,如何让python程序重新运行其
  11. java缓存管理,一级缓存和二级缓存
  12. 如何利用魔棒工具抠图_ps魔棒工具怎么抠图教程合集
  13. 01费曼技巧 - 助你快速掌握软件测试知识
  14. GEE计算Landsat系列影像植被覆盖度
  15. 跟Kaggle做泰坦尼克乘客生存分析
  16. nnU-Net论文笔记
  17. 【PotPlayer】采集Switch图像及录制
  18. 【WebAPI 验证】给 webapi加上token 验证(包括上传文件方法)
  19. python变量及数据类型
  20. Spring Security介绍(4)

热门文章

  1. linux gcc编译错误:statically linked applications requires at runtime the shared libraries
  2. 【Python】青少年蓝桥杯_每日一题_7.27_邮箱密码
  3. Python 实现9*9乘法表
  4. Vue 之qs 使用详解
  5. Java 洛谷 P1909 买铅笔讲解
  6. c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)
  7. python中如何定义颜色_Python图像处理之颜色的定义与使用分析
  8. html5 规定input域,html5中关于input用法
  9. mqtt linux 编译,MQTT客户端代码X64位Ubuntu环境编译+测试实践小结
  10. 五大关键物联网应用助力优化数据中心基础设施管理