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

C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例

C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例

  • 一、左值右值
    • 1.左值
    • 2.右值
  • 二、左值引用右值引用
    • 1.左值引用
    • 2.右值引用
    • 总结
  • 三、integral_constant
  • 四、integral_constant的元模板使用案例
    • 1.求最大整数
    • 2.内存对齐
      • alignof关键字
      • 元模板计算内存对齐


一、左值右值

1.左值

​​含义​​:

  • 代表一个有明确、持久内存位置的​​对象​​。可以理解为能取地址 (&) 的对象。

特点:

  • 有独立的内存地址(可以对其使用取地址运算符 &)。
  • 在程序的多个地方可以使用(即“有名字”,或者可以通过指针/引用持久访问)。
  • 通常出现在赋值表达式的 ​​左边或右边​​。
  • 生命周期超出其所在的单个表达式。

例子:

int main() {int x = 10;      // x是左值 (有地址的存储单元)int arr[5];      // arr是左值int* ptr = &x;   // 对左值取地址有效// 错误用法:// &10;          // 错误!10是右值(字面量没有地址)
}

2.右值

含义​​:

  • 代表一个​​临时的、即将消亡的值​​。通常没有明确的、可由程序通过变量名或指针直接访问的内存地址(或者这种访问没有意义)。可以理解为“只能出现在赋值表达式​​右边​​”的值。

特点:

  • 通常是 ​​临时对象​​ 或 ​​纯常量值​​。
  • ​​不能​​对其使用取地址运算符 &(尝试这样做编译器会报错)。
  • 通常用于:
    初始化赋值(右边)
    函数参数(按值传递或绑定到右值引用)
    作为函数返回值(按值返回)
    只在该表达式中有效,其值在包含该表达式的语句结束后往往不再需要(将被销毁)。

例子:

int calculate() { return 100; }int main() {int a = 20;             int b = a + 5;          // (a+5)是右值(临时计算结果)int c = calculate();    // 函数返回值是右值int d = 30;             // 30本身是右值// 错误用法:// &(a+b);              // 错误!临时结果无地址
}

二、左值引用右值引用

1.左值引用

在这里插入图片描述

2.右值引用

在这里插入图片描述
在这里插入图片描述
实际场景对比

// 传统方式(左值引用)
void process_copy(const std::vector<int>& data) {// 只能读取,无法优化临时数据
}// 现代方式(右值引用重载)
void process_move(std::vector<int>&& data) {// 直接接管临时数据的资源
}int main() {std::vector<int> temp = generateData(); // 生成1GB数据// 传统处理 - 产生额外拷贝process_copy(temp);        // ✅ 安全但慢(保留下次使用)// 优化处理 - 避免拷贝process_copy(generateData());   // ❌ 低效:临时数据仍被拷贝process_move(generateData());   // ✅ 高效:直接接管资源// 显式移交所有权process_move(std::move(temp));  // ⚠️ 移交后temp不再可靠
}

注意:非const左值引用​​不能绑定到右值​

总结

左值​​:有名字、有地址的对象。
​​右值​​:临时对象,没有名字。
​​左值引用(T&)​​:只能绑定左值,用于别名。
​​右值引用(T&&)​​:只绑定右值,用于移动语义。
​​std::move​​:让左值变成右值引用。
​​std::forward​​:在泛型编程中保持值类别。

记住核心目的:右值引用和移动语义是为了避免不必要的拷贝,提升性能。

三、integral_constant

定义常量一般使用:枚举、static、const 去定义。integral_constant可以让我们在预编译期定义常量
基础使用方式如下:

	typedef std::integral_constant<int, 100>::type TestValue;int a = TestValue::value;

四、integral_constant的元模板使用案例

1.求最大整数

定义:

template<int,int...Args>
struct IntMax;template<int a>
struct IntMax<a> : std::integral_constant<int,a>
{};template<int a1,int a2, int...Args>
struct IntMax<a1, a2, Args...>: std::integral_constant<int, a1 >= a2 ?IntMax<a1, Args...>::value :IntMax<a2, Args...>::value>
{};

使用:

std::cout << IntMax<1, 2, 5, 4, 3>::value << std::endl;

2.内存对齐

alignof关键字

用于内存对齐

	struct FStruct{int a;float b;char c;double d;};std::cout << alignof(FStruct) << std::endl; // 结果为8std::cout << sizeof(FStruct) << std::endl; // 结果为24  //int 4 float 4  ||  char 1 -> 8  ||  double 8  ==> 3*8 = 24

元模板计算内存对齐

定义:

template<typename...Args>
struct AlignofStuct : std::integral_constant<int,IntMax<std::alignment_of<Args>::value...>::value>
{};

使用:

	std::cout << AlignofStuct<int, char, float, double>::value << std::endl;
http://www.xdnf.cn/news/15372.html

相关文章:

  • vue2/3生命周期使用建议
  • SpringBoot JAR 反编译替换文件
  • OneCode3.0 MCPServer:注解驱动的AI原生服务架构与实践
  • Docker部署语音转文字(STT)服务并接入Home Assistant
  • C++11 std::is_permutation:从用法到原理的深度解析
  • androidstudio 高低版本兼容
  • 破解 VMware 迁移难题:跨平台迁移常见问题及自动化解决方案
  • 【第六节】docker可视化工具portainer安装
  • Angular 框架下 AI 驱动的企业级大前端应用开
  • Docker 拉取镜像并离线迁移至云桌面指南(以Redis为例)
  • 高安全前端架构:Rust-WASM 黑盒技术揭秘
  • 安全初级(一)
  • vscode 源码编译
  • CA-IS3082W 隔离485 收发器芯片可能存在硬件BUG
  • 如何连接 AWS RDS 数据库实例
  • React Three Fiber 实现 3D 模型视图切换、显隐边框、显隐坐标轴
  • 从欧洲杯初现到世俱杯之巅:海信冰箱的“保鲜传奇”
  • IIS错误:Service Unavailable HTTP Error 503. The service is unavailable.
  • 专题:2025机器人产业深度洞察报告|附136份报告PDF与数据下载
  • 如何将数据从一部手机传输到另一部手机?
  • CompletableFuture 源码解析
  • 微服务引擎 MSE 及云原生 API 网关 2025 年 3 月产品动态
  • CentOS 安装jenkins笔记
  • DiffDet4SAR——首次将扩散模型用于SAR图像目标检测,来自2024 GRSL(ESI高被引1%论文)
  • 深入浅出Kafka Broker源码解析(下篇):副本机制与控制器
  • 总结一下找素数的三种方法
  • 【Bluedroid】蓝牙协议栈enable流程深度解析
  • 若依(RuoYi)框架项目结构全解析
  • [Dify]-进阶1- Dify 支持的多种 AI 模型解析与选择建议
  • Linux修炼:自动化构建make/Makefile