【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 类的解引用操作符 * 来获取一个可以修改元素的左值引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/659.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络:网络层 —— 多播路由选择协议

文章目录 多播路由选择协议多播转发树构建多播转发树基于源树的多播路由选择建立广播转发树建立多播转发树 组共享树的多播路由选择基于核心的生成树的建立过程 因特网的多播路由选择协议 多播路由选择协议 仅使用 IGMP 并不能在因特网上进行IP多播。连接在局域网上的多播路由…

【力扣打卡系列】删除链表重复节点

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day14 删除链表中的节点 题目描述 解题思路 删除指定节点&#xff08;只知道Node&#xff0c;不知道Node上一个节点的情况下&#xff09;将该节点&#xff08;node&#xff09;的后一个节点的值…

【大模型LLM面试合集】大语言模型架构_tokenize分词

tokenize分词 0.总览 分词方法特点被提出的时间典型模型BPE采用合并规则&#xff0c;可以适应未知词2016年GPT-2、RoBERTaWordPiece采用逐步拆分的方法&#xff0c;可以适应未知词2016年BERTUnigram LM采用无序语言模型&#xff0c;训练速度快2018年XLMSentencePiece采用汉字、…

opencv - py_imgproc - py_grabcut GrabCut 算法提取前景

文章目录 使用 GrabCut 算法进行交互式前景提取目标理论演示 使用 GrabCut 算法进行交互式前景提取 目标 在本章中 我们将了解 GrabCut 算法如何提取图像中的前景我们将为此创建一个交互式应用程序。 理论 GrabCut 算法由英国剑桥微软研究院的 Carsten Rother、Vladimir K…

内存马浅析

之前在jianshu上写了很多博客&#xff0c;但是安全相关的最近很多都被锁了。所以准备陆陆续续转到csdn来。内存马前几年一直是个很热门的漏洞攻击手段&#xff0c;因为相对于落地的木马&#xff0c;无文件攻击的内存马隐蔽性、持久性更强&#xff0c;适用的漏洞场景也更多。 J…

串口接收,不定长数据接收

###1.CUBE-MX配置串口 2.我采用串口中断接收&#xff0c;打开中断接口 3.时钟同样8倍频&#xff0c;1分频&#xff0c;使用内部时钟 打开串口中断 main() { __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 启用空闲中断__HAL_UART_ENABLE_IT(&huart1, UART_IT_R…

CentOS 7 更换软件仓库

CentOS 7 于2024年6月30日停止维护&#xff0c;官方仓库已经没有软件了&#xff0c;想要继续使用 &#xff0c;需要更换软件仓库&#xff0c;这里更换到阿里云的软件仓库 https://developer.aliyun.com/mirror/ 查看目前可用的软件数量 yum repolist 更换软件仓库&#xff1a…

Gorilla Mk1机器人:CubeMars电机加持,助力高空作业新突破

在澳大利亚输电网络的高空作业领域&#xff0c;一款由Crest Robotics研发的创新机器人正悄然改变着工作方式。这款名为Gorilla Mk1的机器人&#xff0c;凭借先进的技术和精密的动力系统&#xff0c;在高压输电线路的维护和检修作业中提供了前所未有的安全性和高效性。而这背后&…

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程&#xff0c;包括设计环境的建立&#xff0c;布图规划包括模块尺寸的确定&#xff0c;IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要&#xff0c; 影响芯片的布线资…

Pinia-状态管理

Pinia-状态管理 特点&#xff1a; 1. 轻量和模块化 Pinia 是一个轻量级的状态管理库&#xff0c;支持模块化管理&#xff0c;即可以将应用的状态分成多个 store 以实现更好的组织。使用 Pinia&#xff0c;可以定义多个 store&#xff0c;每个 store 都是一个独立的模块&#x…

WPF界面控件Essential Studio for WPF更新至2024 v3,具有更高性能 | 附下载

Essential Studio for WPF界面控件包含了利于分析且高性能的Windows应用程序开发中所需的所有控件&#xff0c;如 grids、charts、gauges、menus、calendars、editors等等。同时&#xff0c;我们的文件格式库还允许您导出资料到Excel、World和PDF文件中&#xff0c;以及对这些格…

相关衍生 pika+mongo

衍生相关 pikamongo 很多平台不提供完整的数据展示, 翻页只能翻几页,不过提供相关推荐等方法可获取更多的数据; 使用 rabbitmq 是因为数据量可能有几十上百万, 且能持久化 mongo对于数据并不实时的更新到查询里 def main():# mongodb# client MongoClient(localhost, 27017)cl…

软件测试--BUG篇

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. 软件测试的⽣命周期 2. BUG 1. BUG 的概念 2. 描述bug的要素 3.bug级别 4.bug的⽣命周期 5 与开发产⽣争执怎…

【Linux】————进程间通信(匿名管道)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年6月20日 进程间通信的目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享资源通知事件&#xff1a;一个进程需…

Android [调试方法]如何在编译日志中快速找出报错信息

问题描述&#xff1a; 在进行Android完整编译时&#xff0c;经常遇到各种编译导致编译失败的情况&#xff0c;但其日志信息的打印数量十分巨大&#xff0c;无法仔细阅读逐行阅读。对于不熟悉的方法的同学定位报错问题的位置往往需要耗费较长时间。因此本作者将较为典型的方法总…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

将 IBM WatsonX 数据与 Milvus 结合使用,构建用于知识检索的智能 Slack 机器人

在当今快节奏的工作环境中&#xff0c;快速轻松地访问信息对于保持生产力和效率至关重要。无论是在 Runbook 中查找特定说明&#xff0c;还是访问关键知识转移 &#xff08;KT&#xff09; 文档&#xff0c;快速检索相关信息的能力都可以产生重大影响。 本教程将指导您构建一个…

法律智能助手:开源NLP系统助力法律文件高效审查与检索

一、系统概述 思通数科AI平台是一款融合了自然语言处理和多标签分类技术的开源智能文档分类工具&#xff0c;特别适用于法律行业。平台采用深度学习的BERT模型来进行特征提取与关系抽取&#xff0c;实现了精准的文档分类和检索。用户可以在线训练和标注数据&#xff0c;使系统…

在linux系统中安装pygtftk软件

1.下载和安装 网址&#xff1a; https://dputhier.github.io/pygtftk/index.html ## 手动安装 git clone http://gitgithub.com:dputhier/pygtftk.git pygtftk cd pygtftk # Check your Python version (>3.8,<3.9) pip install -r requirements.txt python setup.py in…

Kubernetes:(三)Kubeadm搭建K8s 1.20集群

文章目录 一、Kubeadm安装流程二、实验1.环境准备2.所有节点安装kubeadm&#xff0c;kubelet和kubectl&#xff08;除了Harbor节点&#xff09;3.部署 Dashboard4.安装Harbor私有仓库 一、Kubeadm安装流程 集群名称IP地址安装软件master&#xff08;2C/4G&#xff0c;cpu核心数…