【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() 的值
}
这个函数的作用是:
-
断言:在 operator->() 函数内部,首先调用 _GLIBCXX_DEBUG_ASSERT 函数来断言 get() != pointer()。这意味着 std::unique_ptr 的 get() 方法返回的指针不能等于 std::unique_ptr 自身的指针。这是为了确保 std::unique_ptr 的 get() 方法返回的指针是有效的,指向的是 std::unique_ptr 管理的对象。
-
返回指针:如果断言成功,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 源码学习】
文章目录 1.删除器定义2. operator->() 运算符重载3. add_lvalue_reference<element_type>::type 使用 基本原理这篇博主写的很详细 https://yngzmiao.blog.csdn.net/article/details/105725663 1.删除器定义 deleter_…...
flask第一个应用
文章目录 安装一、编程第一步二、引入配置三、代码解析 安装 python环境安装的过程就不重复赘述了,flask安装使用命令pip install Flask即可,使用命令pip show Flask查看flask版本信息 提示:以下是本篇文章正文内容,下面案例可供…...
华为OD机试真题(Python/JS/C/C++)- 考点 - 细节
华为OD机试 2024E卷题库疯狂收录中,刷题 点这里。 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。...
【C++刷题】力扣-#628-三个数的最大乘积
题目描述 给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。 示例 示例 1 输入:nums [1,2,3] 输出:6示例 2 输入:nums [1,2,3,4] 输出:24示例 3 输入:nums […...
Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着工程教…...
基于微信小程序实现信阳毛尖茶叶商城系统设计与实现
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...
设计一个灵活的RPC架构
RPC架构 RPC本质上就是一个远程调用,需要通过网络来传输数据。传输协议可以有多种选择,但考虑到可靠性,一般默认采用TCP协议。为了屏蔽网络传输的复杂性,需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模…...
大数据计算里的Broadcast Hash Join/Shuffle Hash Join/Sort Merge Join
文章目录 Broadcast Hash Join场景 Shuffle Hash Join场景 Sort Merge Join场景 Broadcast Hash Join 场景 大表和小小表,直接把B表加载到内存,然后读块1内容和内存中数据匹配 Shuffle Hash Join 场景 大表和小表JOIN ,小表分块后能加载…...
Java - 手写识别; 如何用spring ai和大模型做手写识别教程
识别后的文字 利用大模型提升Java手写识别:更简单、更高效 在Java场景中,我们经常需要处理手写识别的问题。过去,这类需求主要依赖于OCR技术,但其效果并不总是稳定。随着大模型的发展,使用大模型进行java手写识别成为…...
【Linux】用户权限管理:创建受限用户并配置特定目录访问权限
本文详细介绍了如何在 Linux 系统中创建一个名为 agent 的新用户,并限制其在特定目录下的权限。通过使用 useradd 命令创建用户,并使用 usermod 命令将新用户添加到现有用户组中,确保其具有适当的权限。接着,通过 chown 和 chmod …...
pgsql表分区和表分片设计
在设计 PostgreSQL 表分区和表分片时,主要目标是提高查询性能、可扩展性和数据管理的效率。以下是一些关键的设计步骤和策略: 1. 分区策略 水平分片:选择按日期进行水平分片,每天一个分片。这种策略适用于具有时间序列数据的场景…...
灵动AI ——视频创作新引擎 开启视觉奇幻之旅
灵动AI视频官网地址:https://aigc.genceai.com/ 灵动AI 科技与艺术的完美融合之作。它代表着当下最前沿的影像技术,为我们带来前所未有的视觉盛宴。...
AI设计、作图、画画工具哪个好用?看完这篇你就知道怎么选了
Stable Diffusion Stable Diffusion 是由 Stability AI 推出的开源 AI 文本到图像生成模型,以其开放性和灵活性在 AI 视觉工具领域广受欢迎。与 DALL-E 或 Midjourney 等只能依赖云计算的工具不同,Stable Diffusion 支持本地运行,也广泛兼容多…...
【python ASR】win11-从0到1使用funasr实现本地离线音频转文本
文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本,以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…...
myqld二进制安装和破解数据库密码(linux)
安装和基本配置 1.首先把下载下来的mysql安装包放到本地这里下载的是5.7版本为演示 1)解压 tar xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz -C /usr/local -把安装包解压到/usr/local cd /usr/local …...
防重方案-订单防重方案笔记
订单防重设计 订单重复提交概念解决方案前端防重机制后端防重机制利用Token机制基于数据库的唯一索引 Token机制方案介绍 其他 订单重复提交概念 重复提交指,连点按钮进行重复提交操作,不包括刷新后的重新下单,重新下单已非同一订单的概念。…...
HTML、JavaScript和CSS实现注册页面设计
目录 一、实现要求 二、实现页面图 1、注册页面 2.用户ID、用户名、口令验证成功后显示页面 三、用户ID、用户名、口令、确定口令验证逻辑js代码 1、验证用户ID 2、验证用户名 3、验证口令密码 四、总结 五、代码仓库 一、实现要求 综合使用HTML、JavaScript和CSS进…...
Counter对象的使用样例
1. Counter类的定义和功能说明 Counter是一个用于跟踪值出现次数的有序集合。它可以接收一个可迭代对象作为参数,并生成一个字典,其中包含每个元素作为键,其计数作为值。 2. 统计列表或字符串中元素的出现次数 示例代码: from…...
大模型中的token是什么;常见大语言模型的 token 情况
目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…...
Python小白学习教程从入门到入坑------第十七课 内置函数拆包(语法基础)
一、内置函数 1.1 查看所有内置函数 内置函数:Python 提供了许多内置函数,这些函数无需导入任何模块即可直接使用。它们涵盖了各种用途,从数学运算到类型检查,再到输入输出操作等。 如何查看内置函数呢? 在Pycharm…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
