C++(25): C++17探索:std::optional

1. 概述

        std::optional是C++17标准引入的一个新的标准库组件。这是一个轻量级的容器,旨在以类型安全的方式包装可能为空的值。std::optional为处理可能缺失的数据提供了一种优雅而简洁的方法,这在以往通常需要使用专门的“存在”标志或复杂的错误处理机制。

        简单点讲,std::optional在使用上并不复杂,主要用来替代那些需要返回NULL,或以返回-1表示错误等的场合。这样做最直观的一个改进就是易读性增强了。

2. 为什么需要std::optional?

        在C++中,函数通常返回一个值或者在失败时返回一个特殊值(如NULL或-1)。这种方法存在几个问题:

(1)类型不安全:返回特殊值通常意味着函数返回的类型与实际返回值的类型不一致,这可能导致类型安全问题。

(2)语义不明确:使用特殊值来表示错误状态可能会与合法的返回值冲突。

(3)错误处理复杂:调用者需要检查返回的特殊值,并进行额外的错误处理。

        std::optional提供了一种更好的解决方案,它允许函数明确地表达它们可能不返回有效值的情况。

3. std::optional的基本概念

        std::optional<T>是一个模板类,其中T是被包装的值的类型。它包含以下两个主要状态:

无值状态:表示不包含有效的T类型对象。

有值状态:包含一个有效的T类型对象。

4. 使用std::optional

(1)构造

std::optional<int> opt;         // 默认构造,无值状态std::optional<int> opt(10);     // 有值状态,包含值10

(2)有无值判断has_value()

        返回一个布尔类型,如果当前容器是有值状态,返回true,否则返回false。

        使用方法如下:

if (opt.has_value()) {// opt包含一个值}

        需要注意的是,当我们想要访问std::optional类型的值时,需要先判断是否有值,否则会出现未定义行为。

(3)使用operator*或value()访问存储的值

        首先我们需要判断是否有值,然后再进行访问。

        或者添加异常捕获单元。

#include <optional>#include <iostream>int main(int argc, char* argv[]){std::optional<int> opt(10);if (opt) {std::cout << "Value: " << *opt << std::endl; ///< 输出 10}return 0;}

int main(int argc, char* argv[]){std::optional<int> opt;try {int value = opt.value(); ///< 这里会抛出异常} catch (const std::bad_optional_access& e) {std::cerr << "Exception: " << e.what() << std::endl;}return 0;}

(4)value_or(T default):返回存储的值,如果std::optional处于无值状态,则返回提供的默认值。

int value = opt.value_or(-1);  ///< 返回10,如果opt无值则返回-1

(5)reset():将std::optional重置为无值状态。

opt.reset();  ///< opt变为无值状态

(6)emplace():在原地构造一个新值,如果std::optional已经有值,则先销毁旧值。

opt.emplace(20);  // opt现在包含20

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

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

相关文章

怎样让拼多多新店靠前?怎么做好拼多多店铺生意?

在拼多多这个日益激烈的电商平台上&#xff0c;新店铺如何脱颖而出、提升排名&#xff0c;成为了许多卖家朋友关注的焦点。那么接下来跟各位卖家详细介绍怎样让拼多多新店靠前&#xff0c;以及怎么做好拼多多店铺生意。 一、怎样让拼多多新店靠前 1、完善店铺信息 完善店铺信…

超声波清洗机哪家好一点?四款无比卓越精品不可错过

在日常生活中&#xff0c;眼镜成为了我们不可或缺的伙伴&#xff0c;无论是阅读书籍、工作还是享受自然风光&#xff0c;清晰的视野总是至关重要。然而&#xff0c;眼镜上不可避免地会沾染灰尘、油脂甚至细菌&#xff0c;影响我们的视觉体验。传统的眼镜清洗方法虽然简单&#…

从0到1构建IM系统之技术选型

由于本人是一个以JAVA为主要编程语言的全栈工程师&#xff0c;所以这次的技术选型也是基于JAVA体系为基础来进行构建。 开发框架&#xff1a; spring 全家桶 功能强大并且覆盖全面&#xff0c;社区活跃&#xff0c;解决方案成熟&#xff0c;学习成本低&#xff08;本人属于拿来…

JAVA学习-练习试用Java实现“Excel表列名称”

问题&#xff1a; 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1&#xff1a; 输入&#xff1a;columnNumber 1 输出&#…

SpringBoot项目文件上传校验工具类

功能介绍 FileValidationUtils是一个工具类&#xff0c;主要用于验证上传的文件。以下是其主要功能和特点&#xff1a; 1. 文件类型验证&#xff1a;FileValidationUtils类中定义了一个MIME_TYPE_MAP&#xff0c;这个映射表包含了允许上传的文件类型和对应的MIME类型。在vali…

package.json的配置

package.json的配置参考 package.json文件是Node.js项目中的一个重要配置文件&#xff0c;用于存储项目的元数据和各种配置信息。 以下是一些常见的 package.json配置项&#xff1a; { "name": "my-project", // 项目名称&#xff0c;遵循npm的命名规范…

新人学习笔记之(JavaScript运算符)

目录 一、运算符 1.运算符&#xff08;operator&#xff09;也被称操作符&#xff0c;最用于实现赋值、比较和算数运算等功能的符号。 2.javascript中常用的有 二、算术运算符 1.算数运算符概述 2.浮点数的精度问题 3.表达式和返回值 三、递增和递减运算符 1.递增和递减运算符…

Python使用MQTT连接新版ONENet

Python MQTT 连接新版ONENet 简介 前几个教程我们使用mqtt.fx连接了新版的ONENet, 只是跑通了MQTT协议&#xff0c;但是在实际操作下还需要实现具体环境、具体设备的MQTT连接&#xff0c;本章教程将以Python MQTT的方式连接 ONENet 参考文档&#xff1a; paho-mqtt PyPI …

数据结构 顺序表

目录 1. 什么是数据结构&#xff1f;2. 顺序表2.1 线性表2.2 顺序表 3. 动态顺序表的实现 正文开始 1. 什么是数据结构&#xff1f; 在学习顺序表前&#xff0c;我们先来了解一下什么是数据结构&#xff1a;数据结构是计算机存储、组织数据的方式&#xff0c;具有一定逻辑关系…

ffprobe 使用文档介绍

ffprobe 摘要 命令格式:ffprobe [options] input_url功能:ffprobe 是一个多媒体分析工具,用于收集多媒体流中的信息,并以易于人类阅读和机器解析的方式打印出来。ffprobe 描述 信息收集:可以检查多媒体流使用的容器格式以及其中每个媒体流的格式和类型。URL 输入:如果输入…

用了那么久的可道云teamOS,居然才发现这个隐藏的功能:一键存图,无需下载

在日常的工作或学习中&#xff0c;我们在遇到喜欢的图片时&#xff0c;总会想要保存下来以备后用。 然而&#xff0c;传统的图片保存方式通常需要我们右键另存为&#xff0c;或者复制链接、打开下载工具&#xff0c;甚至可能需要跳转到其他应用或网页才能完成下载。 存在电脑本…

数据整理的Compact流程 (二)|OceanBase数据转储合并技术解读(二)

上篇文章《数据整理的Compact流程 &#xff08;一&#xff09;&#xff5c;OceanBase数据转储合并技术解读&#xff08;二&#xff09;》中&#xff0c;有讲解到&#xff0c;在OceanBase数据库中&#xff0c;当MemTable写满时&#xff0c;将其下刷到Mini SSTable的过程包含两个…

ubuntu移动硬盘重命名

因为在ubuntu上移动硬盘的名字是中文的&#xff0c;所以想要改成英文的。 我的方法&#xff1a; 将移动硬盘插到windows上&#xff0c;直接右键重命名。再插到ubuntu上名字就改变了。 别人的方法&#xff1a; ubuntu下如何修改U盘名字-腾讯云开发者社区-腾讯云 在自带的软件…

盘点10大灵动惊艳小演员❗谁是你的心头好?

盘点国内影视那些惊艳观众的小演员们无疑为影视作品注入了新的活力。以下是10个备受赞誉的小演员&#xff1a; 1.韩昊霖&#xff1a;凭借在《我和我的祖国》和《庆余年》中的出色表现 韩昊霖的演技赢得了观众和业界的广泛认可 他能够准确地把握角色的情感和细节&#xff0c;展…

海外大带宽云服务器有哪些优势

海外大带宽云服务器是指位于海外数据中心&#xff0c;提供高速网络连接和大量数据传输能力的云计算服务器。Rak部落小编为您整理发布海外大带宽云服务器的相关信息。 具体分析如下&#xff1a; 1. **全球覆盖与低延迟 - **广泛的地域布局**&#xff1a;在全球范围内建立了多个数…

雷达基数据绘制成雷达图

x波段雷达基数据绘制成雷达图 1.雷达基数据格式Z_RADR_I_ZR001_20240521020002_O_DOR_YLD2-D_CAP_FMT.bin.bz2 2.基数据读取 python f StandardData(i) # 新版本标准数据radarTime f.scantime # 获取雷达时次date_str radarTime.strftime(%Y-%m-%d %H:%M:%S)date_str d…

832. 翻转图像 - 力扣

1. 题目 给定一个 n x n 的二进制矩阵 image &#xff0c;先 水平 翻转图像&#xff0c;然后 反转 图像并返回 结果 。 水平翻转图片就是将图片的每一行都进行翻转&#xff0c;即逆序。 例如&#xff0c;水平翻转 [1,1,0] 的结果是 [0,1,1]。 反转图片的意思是图片中的 0 全部被…

一.ffmpeg 将内存中的H264跟PCM 数据流合成多媒体文件

在有一些嵌入式平台中&#xff0c;H264数据流一般来自芯片内部的硬编码器&#xff0c; AAC音频数据则是通过采集PCM进行软编码&#xff0c;但是如何对它实时进行封装多媒体文件 &#xff0c;参考ffmpeg example&#xff0c;花了一些时间终于实现了该功能。 流程图如下&#xf…

【Pandas】深入解析`pd.read_pickle()`函数

【Pandas】深入解析pd.read_pickle()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&…

【动态规划-背包模型part4(混合背包问题、背包问题方案数量)】:混合背包问题、机器分配、背包问题求方案数【已更新完成】

题目类型混合背包问题混合背包问题机器分配背包问题方案数量背包问题求方案数背包问题方案数量 1、混合背包问题 有 N 种物品和一个容量是 V 的背包。 物品一共有三类&#xff1a; 第一类物品只能用1次&#xff08;01背包&#xff09;&#xff1b; 第二类物品可以用无限次&…