标签: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类型的右值,因此过程为:
因此,这个调用实例化 move<string>,即函数
string&& move(string &&t)
在第二个赋值中,实参是一个左值,因此:
因此,这个调用实例化 move<string&>,即
string&& move(string &t)
通常情况下,static_cast 只能用于其他合法的类型转换。但是有一条针对右值的特许规则:虽然不能隐式的将一个左值转换成右值引用,但我们可以用static_cast显示的将一个左值转换为一个右值。
标签:string bsp 实例化 typename color 笔记 过程 数据 使用
原文地址:http://www.cnblogs.com/zoneofmine/p/7440577.html