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.pswp.cn/pingmian/88826.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88826.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88826.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++算法一

1.双指针总结&#xff1a;1.复写0这道题&#xff0c;告诉我们要正难其反&#xff0c;我们从后向前进行重写&#xff0c;删除某些数字的时候&#xff0c;我们可以从前向后遍历&#xff0c;但是增加一些数字的时候会对后面的数据进行覆盖&#xff0c;所以要从后向前进行2.快乐数涉…

LeetCode-283. 移动零(Java)

283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: n…

【数据库】慢SQL优化 - MYSQL

一、数据库故障的关键点 引起数据库故障的因素有操作系统层面、存储层面&#xff0c;还有断电断网的基础环境层面&#xff08;以下称为外部因素&#xff09;&#xff0c;以及应用程序操作数据库和人为操作数据库这两个层面&#xff08;以下称内部因素&#xff09;。这些故障中外…

桶排序算法深度剖析

&#x1f50d; 桶排序算法深度剖析 &#x1f3af; 核心原理图解⚙️ 完整算法流程 #mermaid-svg-LyB6SpaZ132X4Wtn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LyB6SpaZ132X4Wtn .error-icon{fill:#552222;}#mer…

对S32K144做的BMS安装快速开发Simulink库及BMS例程介绍

前言 本章介绍BMS硬件功能及SimuLink库为主&#xff0c;捎带介绍一些例程内容 注意&#xff1a;例程所用的协议均是自定义的 自做的SimuLink库也会不定期更新 BMS例程的内容不定期维护添加 当前的BMS没有主动均衡功能&#xff0c;这个有考虑后期加上&#xff0c;当前还处于…

urlencode、html实体编码、unicode

目录 urlencode html实体编码 Unicode编码 urlencode URL编码也称为百分号编码&#xff0c;用于将URL中的特殊字符转换为安全传输的格式。英文数字一般不编码 特点&#xff1a; 使用%后跟两个十六进制数字表示字符 空格编码为或%20 保留字符&#xff08;; / ? : & …

【HarmonyOS】元服务概念详解

【HarmonyOS】元服务概念详解 最近几年&#xff0c;我们手里的设备越来越多——手机、平板、手表、车机……光是管理这些设备上的APP就够头疼了&#xff1a;下载要流量、安装占内存、换个设备又得重新弄一遍。有没有更简单的方式&#xff1f;HarmonyOS推出的“元服务”&#xf…

vscode/cursor怎么自定义文字、行高、颜色

JetBrains Mono: A free and open source typeface for developers | JetBrains: Developer Tools for Professionals and Teams 首先下载上面的文字&#xff0c;然后右键全选&#xff0c;安装 然后重启cursor 下载插件Apc Customize UI 点击设置 把下面的代码复制进去&…

JavaScript 与 C语言基础知识差别

一&#xff0c; 变量声明对比 C语言&#xff1a; int age 20; // 必须指定类型 float price 9.99; char grade A; const double PI 3.14; // 常量JavaScript&#xff1a; let age 20; // 数字 var price 9.99; // 现在不用&#xff0c;有缺点 co…

无缝矩阵支持音频分离带画面分割功能的全面解析

一、技术原理与实现方式1. 音频分离技术核心功能&#xff1a;HDMI无缝矩阵通过硬件或软件实现音频加嵌与分离功能&#xff0c;支持多设备音频的独立处理与增强。实现方式&#xff1a;音频加嵌&#xff1a;将外部音频信号&#xff08;如麦克风、调音台&#xff09;嵌入HDMI信号中…

AI创作系列第18篇:海狸IM移动端UI统一大升级 - 从混乱到规范的技术重构之路

AI创作系列第18篇&#xff1a;海狸IM移动端UI统一大升级 - 从混乱到规范的技术重构之路本文是海狸IM AI创作系列的第18篇文章&#xff0c;记录7月11日-13日周末期间对移动端的UI统一升级工作。这次重构不是功能性的&#xff0c;而是架构性的 - 我们重新设计了整个UI架构&#x…

八、nginx搭建,实现vue跳转nginx跳转gateway

基本的调用链路: vue调用nginx,nginx反向代理gateway,gateway看用户是否登录,没有登录的话,就创建验证码并先输入密码后获取token。 截止现在我们创建了两个项目能够通过feign调用,并且创建好了gateway,且能调用对应的项目。 这一章节,我们搭建好nginx,通过反向代理,…

C++ 中常见的字符串定义方式及其用法

引言 最近在学习C&#xff0c;下面将从基础到进阶的顺序&#xff0c;列出一些 C 中常见的字符串定义方式及其用法&#xff0c;包含完整代码和详细注释&#xff0c;加深对代码的理解。 C 风格字符串&#xff08;char*或 char[]&#xff09; 定义方式 #include <iostream>i…

下一代防火墙-防范DOS攻击、IPS防护、web防护实验

一、实验拓扑二、实验设备1.山石网科系列下一代防火墙2.三层交换机一台3.windows两台4.各种工具&#xff0c;如hyenae、小旋风服务器、永恒之蓝等等三、实验目的1.掌握网络攻击防护策略配置2.通过下一代防火墙来防护服务器免受DOS攻击四、防范Dos攻击实验1.将一台windows配置为…

【人工智能】通过 Dify 构建智能助手

通过 Dify 构建智能助手1.定义2.如何使用智能助手3.添加助手需要的工具4.配置 Agent5.配置对话开场白6.添加文件上传7.调试与预览8.应用发布1.定义 智能助手&#xff08;Agent Assistant&#xff09;&#xff0c;利用大语言模型的推理能力&#xff0c;能够自主对复杂的人类任务…

破局与重构:文心大模型开源的产业变革密码

——从技术垄断到生态共享的战略转型深度解析 引言&#xff1a;一场静悄悄的革命 2024年&#xff0c;当百度宣布文心大模型4.5系列全面开源时&#xff0c;这不仅仅是一次技术发布&#xff0c;更是一场关于AI产业未来走向的战略博弈。在全球AI竞争白热化的当下&#xff0c;开源意…

7.15 窗口函数 | 二分 | 位运算

05.071.位运算2.位图class Solution { public:int exchangeBits(int num) {bitset<33> bitNum(num);for (int i 0; i < 16; i){bitNum[32] bitNum[2*i];bitNum[2*i] bitNum[2*i1];bitNum[2*i1] bitNum[32];}return (int)bitNum.to_ulong();} };577.员工奖金select…

Windows 安装配置Claude Code

文章目录1.安装node.js2.安装 Claude Code3.测试claude1.安装node.js https://nodejs.org/en/download/ 一路回车即可顺利安装完成。 再键盘按下Win R快捷键&#xff0c;输入cmd&#xff0c;然后回车启动命令行窗口。分别输入node -v和npm -v来查看node.js版本和npm版本。 环…

C++动态数组vector

一、为什么要用vector而不是数组 虽有嘉肴&#xff0c;弗食&#xff0c;不知其旨也。______,____,____________。 简单来说就是节约内存&#xff0c;不容易RE 二、如何使用vector 既谓之数组&#xff0c;则用之如数组 1.定义 vector<数据类型>名称 vector<int …

14.使用GoogleNet/Inception网络进行Fashion-Mnist分类

14.1 GoogleNet网络结构设计import torch from torch import nn from torch.nn import functional as F from torchsummary import summary class Inception(nn.Module):def __init__(self, in_channels,c1,c2,c3,c4,**kwargs):super(Inception,self).__init__(**kwargs)#第一条…