c++23中的新功能之十四输入输出指针

一、介绍

在c++的发展过程中,无论如何发展,c++都尽量保持着与C语言的兼容,当然这也是它的一个特点。在实际的应用中,开发者经常遇到的一个问题是,如何把一个指针的值给传出来?有人会说,简单啊,直接返回不就行了。当然,这样是可以的,但是如果不想通过返回值返回呢(返回值另有它用)?
在普通的变量中,可以通过引用“&”来实现,类似下面的代码:

int test(int &a)
{a =10;return a;
}

指针是不是也可以这样做呢?当然可以,同时它还可以使用双重指针来实现,看下面的代码:

int test(char * & p1,int **p2)
{*p1 = 'c';*pt2 = &data;return 0;
}

这在许多的开源框架中,经常看二级指针的原因。可是,在c++中,随着新标准的推出,智能指针开始广泛在程序中应用,那么智能指针怎么产生上面的应用呢?引用?智能指针本身就是一种引用计数器。再或者转回到普通指针,可是在智能指针和普通指针间来回转又是大忌。

二、INOUT和OUT指针

在c++23的提案中有一个INOUT和OUT的智能指针定义即std::inout_ptr,std::out_ptr。两者的区别是前者可以既可输入又可输出,而后者只能输出。这是什么意思呢?就是说智能指针如果纯输出,则输入进去的智能指针只做一个Reset动作;否则会做一个Release动作后再做一个Reset动作。举一个简单的场景,就是转入一个空的智能指针,然后纯输出一个创建成功的智能指针;而如果有个已经使用的智能指针,想重用,就可以用std::inout_ptr,Release和Reset就自动处理了。这有点类似于C中的remalloc函数。
可能有些开发者在阅读一些开源框架或者源码中,会发现一个函数的参数前有类似的IN或者OUT的定义,跳转过去发现只是一个宏定义的空值,目的当然是让代码看上去更友好。那么在c++23中,如何使用呢?

auto ptr = std::unique_shared<int>();void outSmartptr(int ** ptr){}testSmartptr(std::out_ptr(ptr));
testSmartptr(std::inout_ptr(ptr));

可见,这两个指针就是隐匿的转化成T**。当然,在C语言中会有好多分配内存中会使用void *这种机制,所以这两个指针也要支持这种自动转换。另外,和智能指针一样,这两个指针也支持自定义删除器,类似于:

malloc_mem(std::out_ptr(ptr,[](auto t){free_mem(t);}));

好的,注意点来了。前面提到了,std::out_ptr支持任意Reset的成员指针,所以它支持所有的智能指针;而std::inout_ptr既要Release又要Reset,所以它不支持std::shared_ptr。

三、总结

所以说,应用场景推动了标准的前进。一切的技术手段,最终的目的是为实际应用服务的。脱离了这一导向,技术最终会走向华而不实,然后被淘汰。c++之所以开始快速迭代新的标准,目的也不外乎于此。毕竟,只有变化发展,才是永恒的真理。

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

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

相关文章

七天学会C语言-第一天(C语言基本语句)

一、固定格式 这个是C程序的基本框架&#xff0c;需要记住&#xff01;&#xff01;&#xff01; #include<stdio.h>int main(){return 0; }二、printf 语句 简单输出一句C程序&#xff1a; #include<stdio.h> int main(){printf("大家好&#xff0c;&quo…

数据优化与可视化:3D开发工具HOOPS在BIM模型轻量化中的作用分析

在建筑和工程领域&#xff0c;BIM&#xff08;建筑信息建模&#xff09;是一种重要的数字化工具&#xff0c;但大型BIM模型往往需要大量的计算资源和存储空间。为了解决这一问题&#xff0c;HOOPS技术成为了一种关键工具&#xff0c;可以帮助实现BIM模型轻量化&#xff0c;提高…

[运维|数据库] mysql触发器转postgresql触发器代码示例

mysql触发器 CREATE 、TRIGGER delete_auth_panel AFTER DELETE ON panel_group FOR EACH ROW select delete_auth_source(OLD.id,panel) into ee; 其中 delete_auth_source是函数 转化为PostgreSQL语法示例如下 CREATE OR REPLACE FUNCTION delete_auth_panel() RETURNS TR…

localhost和127.0.0.1的区别

localhost和127.0.0.1都是用于指向本地计算机的地址&#xff0c;但它们在作用和原理上存在一些区别。 作用&#xff1a;localhost是一个域名&#xff0c;通常指向127.0.0.1的IP地址。当我们在设置程序为本地服务时&#xff0c;使用localhost是最好的&#xff0c;因为它不会解析…

uni-app 前端项目(vue)部署到本地win系统Nginx上

若依移动端的项目&#xff1a;整合了uview开源ui框架&#xff0c; 配置后端请求接口基本路径地址&#xff1a; 打包复现到nginx下&#xff1a; 安装个稳定版本的&#xff1a;nginx-1.24.0 部署配置&#xff1a; 增加了网站&#xff1a;8083端口的&#xff0c; 网站目录在ngi…

怒刷LeetCode的第2天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;滑动窗口 方法二&#xff1a;双指针加哈希表 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;二分查找 方法二&#xff1a;归并排序 方法三&#xff1a;分治法 第三题 题目来源 题目内容 解…

Spring AOP使用指南: 强大的面向切面编程技术

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

照片批量处理 7000张

需求&#xff1a; 有6700照片导入系统&#xff1b; 系统只支持500张/每次&#xff1b; 6700 按机构分类复制提取出来&#xff1b; 分批次导入&#xff1b; 6700 分17份复制到对应文件夹中&#xff1b; 照片按照学号命名的&#xff1b; 20231715401.jpg 开始用bat脚本…

c#对接webservice接口

方式一&#xff1a;需要填写地址&#xff0c;不能映射每个方法 工具类 using System; using System.CodeDom.Compiler; using System.CodeDom; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.T…

9月8日作业

思维导图 栈stack.h #ifndef STACK_H #define STACK_H #include <iostream> #define MAXSIZE 128using namespace std; class Stack { public://构造函数Stack();//析构函数~Stack();//拷贝构造函数Stack(const Stack &other);//入栈bool push(int value);//出栈并返…

技师学院物联网实训室建建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

Docker 恶意挖矿镜像应急实例

01、概述 当网络流量监控发现某台运行多个docker容器的主机主动连接到一个疑似挖矿矿池的地址时&#xff0c;需要快速响应和排查&#xff0c;以阻止进一步的损害。 面对docker容器的场景下&#xff0c;如何快速分析和识别恶意挖矿容器?本文将分享一种应急响应思路&#xff0c;…

ARTS打卡第三周

概述 infoq的arts打卡学习&#xff0c;贯彻左耳朵耗子的学习理念&#xff0c;活到老学到老&#xff0c;每天都精进一点&#xff0c;上个星期没有写打卡文档&#xff0c;只能用工作太忙为借口为自己开脱了 一、Algorithm 一道算法题 最近工作使用算法场景较少&#xff0c;基本上…

基于matlab实现的电力系统稳定性分析摆幅曲线代码

完整程序&#xff1a; clear; clc; t 0; tf 0; tfl 0.5; tc 0.5; % tc 0.05, 0.125, 0.5 sec for 2.5 cycles, 6.25 cycles & 25 cycles resp ts 0.05; m 2.52 / (180 * 50); i 2; dt 21.64 * pi / 180; ddt 0; time(1) 0; ang(1) 21.64; pm 0.9; pm1 2.44;…

Redis3.2.1如何设置远程连接?允许局域网访问

背景&#xff1a; 电脑A的redis需要开放给电脑B使用&#xff0c;二者处于同一局域网 【后面会补充更详细的踩坑历程&#xff0c;先发出来作为记录】 过程&#xff1a; 在你查了很多方法后&#xff0c;如果还是没有解决&#xff0c; 尝试考虑一下你的redis配置文件是不是修…

零基础VB6无壳P-CODE逆向分析(VB Decompiler应用与避坑)

> 前言 最近从朋友那里拿到了一个加密狗授权的软件安装包,秉承着LCG的精神,开启了逆向之路,经过查壳和综合分析确定是VB6编写的程序(这年头使用VB6开发商业程序的还真少见),作为一名C# Winform的业余程序员,靠着C#的知识勉强分析个大概. > 授权简介 软件共分三种授权模…

LeetCode LCP 50. 宝石补给

【LetMeFly】LCP 50.宝石补给 力扣题目链接&#xff1a;https://leetcode.cn/problems/WHnhjV/ 欢迎各位勇者来到力扣新手村&#xff0c;在开始试炼之前&#xff0c;请各位勇者先进行「宝石补给」。 每位勇者初始都拥有一些能量宝石&#xff0c; gem[i] 表示第 i 位勇者的宝…

一场深刻的开源聚会:KCC@北京 9.2 活动回顾

开源为我们带来了什么&#xff1f;这是这场聚会的宣传文的标题&#xff1a;https://mp.weixin.qq.com/s/5sR6TPEpQmYNBnCtVilkzg 同样这个问题也可以是极具个体化的&#xff1a;开源为我带来了什么&#xff1f;秋天的周末&#xff0c;预报有雨&#xff0c;北京的开源人还是相聚…

脚本:用python实现五子棋

文章目录 1. 语言2. 效果3. 脚本4. 解读5. FutureReference 1. 语言 Python 无环境配置、无库安装。 2. 效果 以第一回合为例 玩家X 玩家0 3. 脚本 class GomokuGame:def __init__(self, board_size15):self.board_size board_sizeself.board [[ for _ in range(board_…

RecursionError: maximum recursion depth exceeded while calling a Python object

The “RecursionError: maximum recursion depth exceeded” error occurs when a function calls itself recursively too many times, exceeding the maximum recursion depth set by Python. This error is usually triggered by an infinite recursion loop. To fix this …