C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
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相关推荐
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化
1. 类模板的部分特例化(partial specialization) 类模板的特例化不必为所有模板参数提供实参(可以只指定一部分而非所有模板参数, 或是参数的一部分而非全部特性).类模板的部分特例 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义
1. 定义 类似函数模板,类模板以关键字template开始,后跟模板参数列表.在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值: template < ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)效率与灵活性
1. 标准库智能指针类型 shared_ptr 和 unique_ptr shared_ptr unique_ptr 管理所保存的指针的策略 共享指针所有权 独占指针 用户重载默认删除器的方式 在运行 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化
1. 定义一个特例化版本, 模板参数为 Sales data // 打开std 命名空间, 以便特例化 std::hash namespace std {template struct hash< ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化
1. 场景 //第一个版本:可以比较任意两个类型 template <typename T> int compare (const T &, const T & );//第 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包
1. 使用可变参数模板与 forward 机制来编写函数, 实现将其实参不变地传递给其他函数(保持实参的原始类型) 1.1 eg class StrVec {public:template <c ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展
1. 扩展 ( expand) 扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表. 通过在模式右边放一个省略号(-)来触发扩展操作.当扩展一个包时,我们还要提供用于每个扩展 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板
1. 可变参数模板( variadic template) 一个接受可变数目参数的模板函数或模板类. 1.1 参数包 (parameter packet) 可变数目的参数被称为参数包,存在两种参数包: ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)重载模板和类型转换
1. C 风格字符串指针和字符串字面常量 cout « debug_rep ("hi world!" ) << endl; / / 调用 debug_rep (T* ) ...
最新文章
- LeetCode简单题之判断矩阵经轮转后是否一致
- 4-类和结构体和可选类型
- MySQL数据库语句总结
- 使用linux内核编译独立系统,编译linux内核以及depmod的使用
- 国际C语言混乱代码大赛结果公布
- SpringBoot中注入ApplicationContext对象的三种方式
- fastjson jsonobject 转bean失败_FastJson是如何导致App Crash的
- DE25 Homogeneous Linear Systems with Constant Coefficients
- redis php高级使用_项目中应用Redis+Php的场景
- python怎么重新运行,如何让python程序重新运行其
- java缓存管理,一级缓存和二级缓存
- 如何利用魔棒工具抠图_ps魔棒工具怎么抠图教程合集
- 01费曼技巧 - 助你快速掌握软件测试知识
- GEE计算Landsat系列影像植被覆盖度
- 跟Kaggle做泰坦尼克乘客生存分析
- nnU-Net论文笔记
- 【PotPlayer】采集Switch图像及录制
- 【WebAPI 验证】给 webapi加上token 验证(包括上传文件方法)
- python变量及数据类型
- Spring Security介绍(4)
热门文章
- linux gcc编译错误:statically linked applications requires at runtime the shared libraries
- 【Python】青少年蓝桥杯_每日一题_7.27_邮箱密码
- Python 实现9*9乘法表
- Vue 之qs 使用详解
- Java 洛谷 P1909 买铅笔讲解
- c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)
- python中如何定义颜色_Python图像处理之颜色的定义与使用分析
- html5 规定input域,html5中关于input用法
- mqtt linux 编译,MQTT客户端代码X64位Ubuntu环境编译+测试实践小结
- 五大关键物联网应用助力优化数据中心基础设施管理