当前位置: 首页 > news >正文

C++标准库——move和forward

文章目录

    • move
    • forward
    • 总结
    • 参考

基于C++11标准

在c++标准库的utility中,提供了下面几个非常用用的小函数:

  • x2=forward(x):x2是一个右值;不抛出异常
  • x2=move(x):x2是一个右值;不抛出异常
  • x2=move_if_noexcept(x):若x可移动,x2=move(x);否则x2=x;不抛出异常

move

move进行简单的右值转换:

template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

我们用move告知编译器:此对象在上下文中不再被使用,因此其值可被移动,留下一个空对象
最简单的例子是一个swap的可能实现:

template<class T>
void swap(T& a, T& b) noexcept(is_nothrow_move_constructible<T>() && is_nothrow_move_assignable<t>())
{
	T tmp{move(a)};
	a = move(b);
	b = move(tmp);
}

forward

forward从右值生成一个右值:

template< class T >
T&& forward( typename std::remove_reference<T>::type& t ) noexcept;
template< class T >
T&& forward( typename std::remove_reference<T>::type&& t ) noexcept;

这一对forward函数总是会一起提供,两者之间的选择是通过重载解析实现的。任何左值都会调用第一个版本处理,任何右值都会转向第二个版本处理。

forward的典型用法是将一个实参从一个函数完美转发到另一个函数。标准库make_shared<T>(x)是一个很好的例子。

总结

当希望用一个移动操作”窃取“一个对象的表示形式时,使用move;
当希望转发一个对象时,用forward。
因此,forward(x)总是安全的,而move(x)标记x将被销毁,因此要小心使用。
调用move(x)之后x唯一安全的用法就是析构或是赋值的目的。显然,一个特定类型可能提供更多的保证,理想情况下类的不变式保持不变。但是,除非你确切知道这类保证,否则不要依赖他们。

参考

Standard library header utility
使用std::move优化函数返回值

相关文章:

  • Windows辉煌的发展历程
  • AMBA-CHI协议详解(十九)
  • Docker用户的困境:免费项目的减少与成本的增加
  • QT 基础知识点
  • 计算机视觉:主流数据集整理
  • python: 并发编程 (Concurrent Programming) Simple example
  • TensorFlow 是一个由 Google 开发的开源机器学习库
  • 2025tg最新免费社工库机器人
  • pipeline 使用git parameter插件实现动态选择分支构造
  • bpmn.js + Node.js_构建高效的后端工作流处理系统
  • KAJIMA CORPORATION CONTEST 2025 (AtCoder Beginner Contest 394)题解 ABCDE
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-utils.py
  • 大湾区经济网报道:2025春运收官 全国跨区流动90亿,大湾区12亿人次
  • 支持向量机(SVM):算法讲解与原理推导
  • 线结构光三维重建
  • C语言之递归
  • 【排序算法】六大比较类排序算法——插入排序、选择排序、冒泡排序、希尔排序、快速排序、归并排序【详解】
  • 【架构】事件驱动架构(Event - Driven Architecture,EDA)
  • electron提升软件运行权限,以管理员权限运行
  • Linux 常见指令
  • 商务部就开展加强战略矿产出口全链条管控工作应询答记者问
  • 人才争夺战,二三线城市和一线城市拼什么?洛阳官方调研剖析
  • 排污染黑海水后用沙土覆盖黑泥?汕尾环保部门:非欲盖弥彰
  • 27岁杨阳拟任苏木镇党委副职,系2020年内蒙古自治区选调生
  • 基因编辑技术让蜘蛛吐彩丝
  • “不为一时一事所惑,不为风高浪急所扰”——习近平主席对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典纪实