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

C++ 新特性 | C++ 11 | std::move

文章目录

  • 一、std::move
    • 1、std::move 源码实现
    • 2、工作原理
    • 3、关键点解析
    • 4、示例分析
    • 5、为什么需要 remove_reference
    • 6、总结

前言:

std::move 是 C++11 引入的一个关键工具,其实现非常简洁但功能强大。

一、std::move

1、std::move 源码实现

在标准库头文件 <utility> 中,std::move 通常实现如下:

template <typename T>
constexpr typename std::remove_reference<T>::type&& move(T&& t) noexcept {
    return static_cast<typename std::remove_reference<T>::type&&>(t);
}

C++14 以后可以简化为:

template <typename T>
constexpr std::remove_reference_t<T>&& move(T&& t) noexcept {
    return static_cast<std::remove_reference_t<T>&&>(t);
}

2、工作原理

  • 模板参数 T&&
    • 这是一个通用引用(universal reference),可以绑定到左值和右值
    • 当传入左值时,T 被推导为 T&
    • 当传入右值时,T 被推导为 T
  • std::remove_reference
    • 移除类型的所有引用修饰,确保我们得到原始类型
    • 例如:std::remove_reference<int&>::typeint
  • static_cast
    • 将参数强制转换为右值引用类型
    • 这是实际发生"移动语义魔法"的地方
  • noexcept
    • 表明这个操作不会抛出异常
    • 移动操作通常应该是 noexcept 的

3、关键点解析

  • std::move 不执行任何移动操作,它只是将值转换为右值引用
  • 实际的移动工作是由移动构造函数移动赋值运算符完成的
  • 转换后的右值引用使得编译器优先选择移动操作而非拷贝操作

注意std::move 本身不会移动任何数据,它只是执行一个类型转换。

4、示例分析

std::string s1 = "Hello";
std::string s2 = std::move(s1);
  1. std::move(s1)s1 转换为 std::string&&
  2. 编译器看到右值引用,选择 std::string 的移动构造函数
  3. s2 的构造通过移动 s1 的资源完成
  4. s1 现在处于有效但未定义状态(通常为空)

5、为什么需要 remove_reference

考虑以下情况:

int x = 10;
int& y = x;
auto&& z = std::move(y);  // 如果没有 remove_reference,可能会得到 int& && 的情况

std::remove_reference 确保我们总是得到干净的 T&& 而不是可能出现的引用折叠情况。

6、总结

std::move 的核心工作就是通过类型转换将一个值标记为"可移动的",让编译器知道可以使用移动语义而非拷贝语义。它本身不移动任何数据,只是为移动操作创造条件。实际的资源转移是由对应类的移动构造函数或移动赋值运算符完成的。

http://www.dtcms.com/a/106515.html

相关文章:

  • maven如何使用
  • 《UNIX网络编程卷1:套接字联网API》第4章 基本TCP套接字编程
  • 一周掌握Flutter开发--9. 与原生交互(下)
  • 04-08核心配置和映射配置文件解析
  • 14.主从Reactor+线程池模式,Connection对象引用计数的深入分析
  • 【UE5】发现意外的文件尾解决方法
  • 国产系统服务器识别不到stata盘
  • C语言--统计输入字符串中的单词个数
  • 前端新增数据,但数据库里没有新增的数据
  • k8s 污点常用操作
  • Qt进阶开发:QFileSystemModel的使用
  • Rust 开发提效神器:lombok-macros 宏库
  • 吴恩达深度学习复盘(5)神经网络的前向传播TesorFlow与NumPy实现比对
  • 【高并发内存池】第八弹---脱离new的定长内存池与多线程malloc测试
  • 【redis】redis实现红锁
  • 关于文化和软件技术的传承
  • resttemplate设置params
  • C++与Python初始化最小和最大整数
  • 多传感器融合SLAM中如何检验编写的Factor是否有效
  • 黑马点评。1 导入黑马点评项目
  • C++ 中的 **CRTP
  • 鸿蒙定位开发服务
  • 论文浅尝 | Interactive-KBQA:基于大语言模型的多轮交互KBQA(ACL2024)
  • HTML 媒体(Media)学习笔记
  • 使用Apache HttpClient编写Java爬虫
  • Python | 第十一章 | 模块和包 | 面向对象编程_基础部分
  • Java安全基础-反射机制
  • 《AI大模型应知应会100篇》第2篇:大模型核心术语解析:参数、Token、推理与训练
  • 基于微信小程序的智慧乡村旅游服务平台【附源码】
  • 聊聊Spring AI的EmbeddingModel