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

【unique_str 源码学习】

文章目录

    • 1.删除器定义
    • 2. operator->() 运算符重载
    • 3. add_lvalue_reference<element_type>::type 使用

基本原理这篇博主写的很详细

https://yngzmiao.blog.csdn.net/article/details/105725663

1.删除器定义

deleter_type& get_deleter() noexcept                  // 获取删除器
{ return std::get<1>(_M_t); }

在这里插入图片描述
在这里插入图片描述

2. operator->() 运算符重载

pointer operator->() const noexcept                   // 智能指针->运算符
{_GLIBCXX_DEBUG_ASSERT(get() != pointer());          // 断言 get() 不等于 pointer()return get();                                        // 返回 get() 的值
}

这个函数的作用是:

  1. 断言:在 operator->() 函数内部,首先调用 _GLIBCXX_DEBUG_ASSERT 函数来断言 get() != pointer()。这意味着 std::unique_ptr 的 get() 方法返回的指针不能等于 std::unique_ptr 自身的指针。这是为了确保 std::unique_ptr 的 get() 方法返回的指针是有效的,指向的是 std::unique_ptr 管理的对象。

  2. 返回指针:如果断言成功,operator->() 函数会返回 get() 方法返回的指针。get() 方法返回的是 std::unique_ptr 管理的对象的指针。

operator->() 函数的作用是允许用户通过 std::unique_ptr 对象访问其管理的对象的成员。例如,如果 std::unique_ptr 管理的是一个 MyClass 对象,你可以通过 ptr->member 的方式访问 MyClass 对象的成员,而不是通过ptr.get()->member 的方式。(内部实现是通过ptr.get()->member

请注意,operator->() 函数被声明为 noexcept,这意味着这个函数不会抛出异常。这对于智能指针的实现非常重要,因为智能指针需要在析构函数或 reset 方法中调用删除器,而不能抛出异常。

#include <iostream>
#include <memory>class MyClass {
public:int value;void print() const {std::cout << "Value: " << value << std::endl;}
};int main() {// 创建一个 MyClass 对象,并使用 std::unique_ptr 管理它std::unique_ptr<MyClass> ptr(new MyClass);ptr->value = 10;  // 使用 operator->() 访问 MyClass 对象的成员// 调用 MyClass 对象的成员函数ptr->print();return 0;
}

在这个示例中,我们首先定义了一个 MyClass 类,它有一个成员变量 int value 和一个成员函数 void print()。然后,我们使用 std::unique_ptr 来管理一个 MyClass 对象。

通过 ptr->value = 10; 和 ptr->print();,我们可以使用 std::unique_ptr 的 operator->() 运算符来访问和操作 MyClass 对象的成员。ptr->value = 10; 设置了 MyClass 对象的 value 成员为 10,而 ptr->print(); 调用了 MyClass 对象的 print 成员函数。

这个示例展示了如何使用 std::unique_ptr 和 operator->() 来管理和操作智能指针管理的对象。**

3. add_lvalue_reference<element_type>::type 使用

typename add_lvalue_reference<element_type>::type operator*() const   // 解引用
{_GLIBCXX_DEBUG_ASSERT(get() != pointer());return *get();
}

在上述代码中,typename add_lvalue_reference<element_type>::type operator*() const 定义了一个解引用操作符 *,用于解引用智能指针。add_lvalue_reference 是一个模板类,它用于将一个类型转换为左值引用类型。在这里,它用于将 element_type 转换为左值引用类型。

element_type 是一个模板参数,它表示智能指针所指向的元素类型。add_lvalue_reference<element_type>::type 返回 element_type 的左值引用类型。左值引用是一种引用类型,它允许你修改被引用的对象。

operator* 函数的作用是返回指针所指向的元素的左值引用。这意味着,当你使用 * 操作符解引用智能指针时,你将得到一个可以修改元素的左值引用。

例如,如果 element_type 是 int,那么 add_lvalue_reference<element_type>::type 将返回 int&,即 int 类型的左值引用。

_GLIBCXX_DEBUG_ASSERT(get() != pointer()); 这行代码是一个断言,用于确保智能指针的值不是空指针。在解引用操作时,如果智能指针的值是空指针,程序将抛出一个异常,因为你不能对空指针解引用。

return *get(); 这行代码返回指针所指向的元素的左值引用。get() 函数返回智能指针的值。*get() 将返回智能指针所指向的元素的左值引用。

例如,如果 element_type 是 int,那么 *get() 将返回一个 int& 类型的左值引用,你可以通过这个引用修改 int 类型的值。

请注意,operator* 函数的返回类型是 add_lvalue_reference<element_type>::type,这意味着它返回的是 element_type 的左值引用类型。在使用 operator* 解引用智能指针时,你将得到一个可以修改元素的左值引用。
在这里插入图片描述
在这个例子中,我们首先定义了一个模板类 add_lvalue_reference,它的作用是将一个类型转换为左值引用类型。然后,我们定义了一个智能指针类 SmartPtr,它使用 add_lvalue_reference 模板类来实现解引用操作。

在 main 函数中,我们创建了一个整数对象 num,然后创建了一个 SmartPtr 对象 sp,并将其指向 num。然后,我们使用解引用操作符 * 解引用 sp,得到一个可以修改 num 值的左值引用 ref。最后,我们修改了 num 的值,并输出其新的值。

这个例子展示了如何使用 SmartPtr 类的解引用操作符 * 来获取一个可以修改元素的左值引用。

相关文章:

【unique_str 源码学习】

文章目录 &#xff11;&#xff0e;删除器定义2. operator->() 运算符重载3. add_lvalue_reference<element_type>::type 使用 基本原理这篇博主写的很详细 https://yngzmiao.blog.csdn.net/article/details/105725663 &#xff11;&#xff0e;删除器定义 deleter_…...

flask第一个应用

文章目录 安装一、编程第一步二、引入配置三、代码解析 安装 python环境安装的过程就不重复赘述了&#xff0c;flask安装使用命令pip install Flask即可&#xff0c;使用命令pip show Flask查看flask版本信息 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供…...

华为OD机试真题(Python/JS/C/C++)- 考点 - 细节

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。...

【C++刷题】力扣-#628-三个数的最大乘积

题目描述 给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 示例 示例 1 输入&#xff1a;nums [1,2,3] 输出&#xff1a;6示例 2 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;24示例 3 输入&#xff1a;nums […...

Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着工程教…...

基于微信小程序实现信阳毛尖茶叶商城系统设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用&#xff0c;需要通过网络来传输数据。传输协议可以有多种选择&#xff0c;但考虑到可靠性&#xff0c;一般默认采用TCP协议。为了屏蔽网络传输的复杂性&#xff0c;需要封装一个单独的数据传输模块用来收发二进制数据&#xff0c;这个单独模…...

大数据计算里的Broadcast Hash Join/Shuffle Hash Join/Sort Merge Join

文章目录 Broadcast Hash Join场景 Shuffle Hash Join场景 Sort Merge Join场景 Broadcast Hash Join 场景 大表和小小表&#xff0c;直接把B表加载到内存&#xff0c;然后读块1内容和内存中数据匹配 Shuffle Hash Join 场景 大表和小表JOIN &#xff0c;小表分块后能加载…...

Java - 手写识别; 如何用spring ai和大模型做手写识别教程

识别后的文字 利用大模型提升Java手写识别&#xff1a;更简单、更高效 在Java场景中&#xff0c;我们经常需要处理手写识别的问题。过去&#xff0c;这类需求主要依赖于OCR技术&#xff0c;但其效果并不总是稳定。随着大模型的发展&#xff0c;使用大模型进行java手写识别成为…...

【Linux】用户权限管理:创建受限用户并配置特定目录访问权限

本文详细介绍了如何在 Linux 系统中创建一个名为 agent 的新用户&#xff0c;并限制其在特定目录下的权限。通过使用 useradd 命令创建用户&#xff0c;并使用 usermod 命令将新用户添加到现有用户组中&#xff0c;确保其具有适当的权限。接着&#xff0c;通过 chown 和 chmod …...

pgsql表分区和表分片设计

在设计 PostgreSQL 表分区和表分片时&#xff0c;主要目标是提高查询性能、可扩展性和数据管理的效率。以下是一些关键的设计步骤和策略&#xff1a; 1. 分区策略 水平分片&#xff1a;选择按日期进行水平分片&#xff0c;每天一个分片。这种策略适用于具有时间序列数据的场景…...

灵动AI ——视频创作新引擎 开启视觉奇幻之旅

灵动AI视频官网地址&#xff1a;https://aigc.genceai.com/ 灵动AI 科技与艺术的完美融合之作。它代表着当下最前沿的影像技术&#xff0c;为我们带来前所未有的视觉盛宴。...

AI设计、作图、画画工具哪个好用?看完这篇你就知道怎么选了

Stable Diffusion Stable Diffusion 是由 Stability AI 推出的开源 AI 文本到图像生成模型&#xff0c;以其开放性和灵活性在 AI 视觉工具领域广受欢迎。与 DALL-E 或 Midjourney 等只能依赖云计算的工具不同&#xff0c;Stable Diffusion 支持本地运行&#xff0c;也广泛兼容多…...

【python ASR】win11-从0到1使用funasr实现本地离线音频转文本

文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本&#xff0c;以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…...

myqld二进制安装和破解数据库密码(linux)

安装和基本配置 1.首先把下载下来的mysql安装包放到本地这里下载的是5.7版本为演示 1&#xff09;解压 tar xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz -C /usr/local -把安装包解压到/usr/local cd /usr/local …...

防重方案-订单防重方案笔记

订单防重设计 订单重复提交概念解决方案前端防重机制后端防重机制利用Token机制基于数据库的唯一索引 Token机制方案介绍 其他 订单重复提交概念 重复提交指&#xff0c;连点按钮进行重复提交操作&#xff0c;不包括刷新后的重新下单&#xff0c;重新下单已非同一订单的概念。…...

HTML、JavaScript和CSS实现注册页面设计

目录 一、实现要求 二、实现页面图 1、注册页面 2.用户ID、用户名、口令验证成功后显示页面 三、用户ID、用户名、口令、确定口令验证逻辑js代码 1、验证用户ID 2、验证用户名 3、验证口令密码 四、总结 五、代码仓库 一、实现要求 综合使用HTML、JavaScript和CSS进…...

Counter对象的使用样例

1. Counter类的定义和功能说明 Counter是一个用于跟踪值出现次数的有序集合。它可以接收一个可迭代对象作为参数&#xff0c;并生成一个字典&#xff0c;其中包含每个元素作为键&#xff0c;其计数作为值。 2. 统计列表或字符串中元素的出现次数 示例代码&#xff1a; from…...

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…...

Python小白学习教程从入门到入坑------第十七课 内置函数拆包(语法基础)

一、内置函数 1.1 查看所有内置函数 内置函数&#xff1a;Python 提供了许多内置函数&#xff0c;这些函数无需导入任何模块即可直接使用。它们涵盖了各种用途&#xff0c;从数学运算到类型检查&#xff0c;再到输入输出操作等。 如何查看内置函数呢&#xff1f; 在Pycharm…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...