std::move的实际工作过程
std::move的定义如下:
1 template <typename T> 2 typename remove_reference<T>::type && move(T&& t) 3 { 4 return static_cast<typename remove_reference<T>::type&&>(t); 5 }
通过引用折叠,此参数可以与任何类型的实参匹配,既可以传递给move一个左值引用也可以传右值引用,如:
string s1("hi"), s2;
s2 = std::move(string("bye1!"));//正确,从一个右值移动数据
s2 = std::move(s1);//正确,但赋值之后,s1的值是不确定的。
1)针对std::move(string("bye1!")); 传入的已经是右值引用
- 函数模板推断出T的类型为string
- 因此,remove_reference用string进行实例化
- remove_reference<string>的 type成员是string
- move的返回类型是string&&move的函数参数t的类型是string&&
string&& move(string&& t);
函数体返回static_cast<string&&>(t),由于t的类型已经是右值引用,因此无需进行任何转化。
2)针对std::move(s1); 传入的就是一个左值
- 函数模板推断出T的类型是string&(因为string& &&才能折叠为string&)
- 因此,remove_reference用string&进行实例化
- remove_reference<string>的 type成员是string
- move的返回类型是string&&
- move的函数参数t的类型是string& &&,会折叠为string&
因此等价于:
string&& move(string& t);
函数体返回static_cast<string&&>(t),这里t的类型是string&,通过static_cast将其转化为string&&
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2017-03-01 struct和typedef struct彻底明白了