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

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.dtcms.com/a/278459.html

相关文章:

  • 量子计算新突破!阿里“太章3.0”实现512量子比特模拟(2025中国量子算力巅峰)
  • ethers.js-5–和solidity的关系
  • RPC 框架学习笔记
  • Spark 之 like 表达式
  • 软件测试中的BUG等级与生命周期详解
  • 走近科学IT版:EasyTire设置了ip,但是一闪之后就变回到原来的dhcp获得的地址
  • ros2版本自定义插件的实现与热插拔
  • 设计模式(行为型)-迭代器模式
  • java 判断两个集合中没有重复元素
  • iOS高级开发工程师面试——Objective-C 语言特性
  • Linux(Ubuntu)硬盘使用情况解析(已房子举例)
  • rk3588ubuntu 系统移植AIC8800D Wi-Fi6/BT5.0芯片
  • EMQX + Amazon S3 Tables:从实时物联网数据到数据湖仓
  • C++函数指针
  • Redis作缓存时存在的问题及其解决方案
  • 云原生核心技术解析:Docker vs Kubernetes vs Docker Compose
  • Word 与 Excel 下拉菜单对比(附示例下载)
  • 前端将传回的List数据组织成树形数据并展示
  • MEMS IMU如何赋能无人机与机器人精准感知?
  • 跨膜粘蛋白MUC17
  • MAC安装虚拟机
  • UE5多人MOBA+GAS 22、创建技能图标UI,实现显示蓝耗,冷却,以及数字显示的倒数计时还有雷达显示的倒数计时
  • IDEA中使用Servlet,tomcat输出中文乱码
  • ubuntu22.04下配置qt5.15.17开发环境
  • Kotlin委托
  • 【Python】基础语法
  • 亚马逊新规!7月13日起合规性文件须出自符合要求的实验室!
  • 【飞牛云fnOS】告别数据孤岛:飞牛云fnOS私人资料管家
  • 【Hadoop科普篇】大数据怎么处理?Hadoop是什么?跟HDFS, Spark, Flink, Hive, Hbase是什么关系?
  • 嵌入式硬件篇---晶体管的分类