(C++) std::move std::forward及使用
概念
- std::ref :针对std::thread,需要把实参显式转换为引用类型;
- std::move :无条件把参数转换为右值;但是右值赋值给新变量时,实际还要看是否满足右值条件,如const std::string&& 赋值后,实际调用的是左值构造/赋值;
- std::forward :根据实参类型决定传递给下一层function的参数类型使用;被称为完美转发 (也叫精确传递);
std::forward比较多的是配合 T&& 使用(使用在template代码中);其作用之一是将参数本层调用传递给下一层调用。
void log_and_consume(std::string&& message) {
std::cout << "LOG: logging with rvalue\n";
consume(message);
}
void log_and_consume(std::string const& message) {
std::cout << "LOG: logging with lvalue\n";
consume(message);
}
int main() {
auto msg = std::string("sample message");
log_and_consume(msg);
log_and_consume("sample message");
}
期望的输出:
LOG: logging with lvalue
Consumes an lvalue
LOG: logging with rvalue
Consumes an rvalue
实际的输出:
LOG: logging with lvalue
Consumes an lvalue
LOG: logging with rvalue
Consumes an lvalue
折叠规则
template <class... Args>
void forward(Args&&... args) {
f(std::forward<Args>(args)...);
}
折叠规则为:
&& && -> &&
& && -> &
& & -> &
&& & -> &
move/forward只是执行类型转换,且在编译期间。
分类:
C++
标签:
C++ / template
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通