分析 std::optional 的使用与常见错误

在这里插入图片描述

文章目录

  • 引言
  • 常见错误及解决方案
    • 1. 错误使用 `std::optional` 变量进行算术运算
    • 2. 错误检查 `std::optional` 是否有值
    • 3. 忽视 `std::optional` 的默认值
  • 结论

引言

std::optional 是 C++17 引入的一个模板类,用于表示可能有也可能没有值的情况。它特别适用于函数返回值,可以明确表示“无值”状态,避免使用特殊的值(如 -1nullptr)来表示错误或缺失的情况。尽管 std::optional 非常有用,但在实际编程中如果不正确使用,可能会导致编译错误或运行时错误。本文将探讨几种常见的 std::optional 使用错误及其解决方案。

常见错误及解决方案

1. 错误使用 std::optional 变量进行算术运算

错误示例:

std::optional<int> AtEndOfLineSpaceNum = 5;
int result = AtEndOfLineSpaceNum + 10; // 编译错误

错误分析:
在上述代码中,尝试直接对 std::optional<int> 类型的变量 AtEndOfLineSpaceNum 和整数 10 进行加法运算。由于 std::optional 并不是一个数值类型,编译器无法自动解包 std::optional 内部的值来进行运算,因此会导致编译错误。

解决方案:
使用 .value() 方法获取 std::optional 内部的值,然后再进行算术运算。

std::optional<int> AtEndOfLineSpaceNum = 5;
int result = AtEndOfLineSpaceNum.value() + 10; // 正确

注意事项:
.value() 方法会在 std::optional 没有值时抛出异常 std::bad_optional_access。为了避免这种情况,可以使用 .value_or(defaultValue) 方法提供一个默认值。

std::optional<int> AtEndOfLineSpaceNum;
int result = AtEndOfLineSpaceNum.value_or(0) + 10; // 如果 AtEndOfLineSpaceNum 没有值,则使用 0

2. 错误检查 std::optional 是否有值

错误示例:

void OutPut(std::string msg, Console::MessageType msgType,std::optional<bool> isAtEndOfLine = false) {if (isAtEndOfLine) {moveCursorUpAndToRight(1, msg.size() + 10);}// 其他代码...
}

错误分析:
在这个例子中,isAtEndOfLine 被用作条件表达式的条件。即使 isAtEndOfLine 没有值或其值为 falseif (isAtEndOfLine) 仍然会评估为 true,因为 std::optional 对象本身不是 std::nullopt

解决方案:
应该检查 std::optional 是否有值,并且如果有值,再进一步检查其内部值。

void OutPut(std::string msg, Console::MessageType msgType,std::optional<bool> isAtEndOfLine = false) {if (isAtEndOfLine.has_value() && *isAtEndOfLine) {moveCursorUpAndToRight(1, msg.size() + 10);}// 其他代码...
}

或者更简洁的方式:

void OutPut(std::string msg, Console::MessageType msgType,std::optional<bool> isAtEndOfLine = false) {if (isAtEndOfLine.value_or(false)) {moveCursorUpAndToRight(1, msg.size() + 10);}// 其他代码...
}

3. 忽视 std::optional 的默认值

错误示例:

void processOptional(std::optional<int> value) {int result = value + 10; // 编译错误
}

错误分析:
在这个例子中,尝试直接对 std::optional<int> 类型的参数 value 进行算术运算。如果 value 没有值,这将导致编译错误。

解决方案:
使用 .value_or(defaultValue) 方法提供一个默认值,以防止 std::optional 没有值时的错误。

void processOptional(std::optional<int> value) {int result = value.value_or(0) + 10; // 如果 value 没有值,则使用 0
}

结论

std::optional 是一个非常有用的工具,可以帮助我们更好地处理可能不存在的值。然而,正确使用 std::optional 需要注意几个关键点:

  • 算术运算:必须先使用 .value().value_or(defaultValue) 获取内部值。
  • 条件检查:应使用 .has_value()* 操作符或 .value_or(defaultValue) 组合来检查和获取值。
  • 默认值:始终考虑 std::optional 可能没有值的情况,并提供适当的默认值。

通过遵循这些指导原则,可以避免常见的错误,使代码更加健壮和清晰。

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

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

相关文章

本地搭建php包依赖管理工具,使用satis搭建私有composer仓库

一、总体设计 dns服务器nginxsatis web 静态页面satis manage 管理程序 二、nginx配置 1、nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://ngi…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

Ubuntu-22.04 虚拟机安装

1. Ubuntu安装方式 1.1. 基于物理介质安装 光盘安装&#xff1a;通过将 Ubuntu 镜像刻录到光盘&#xff0c;在计算机 BIOS/UEFI 中设置光盘为第一启动项&#xff0c;然后按照安装程序的提示进行语言选择、分区、用户信息设置等操作来完成安装。这种方式需要有光盘刻录设备和空…

软件设计师-上午题-12、13 软件工程(11分)

软件工程题号一般为17-19和29-36题&#xff0c;分值一般为11分。 目录 1 软件过程 1.1 CMM(能力成熟度模型) 1.1.1 真题 1.2 CMMI(能力成熟度模型集成) 1.2.1 真题 2 软件过程模型 2.1 瀑布模型 2.2 V模型 2.2.1 真题 2.3 增量模型 2.3.1 真题 2.4 演化模型 2.5 …

Bartender 5 for Mac 菜单栏管理软件 安装教程【保姆级教程,操作简单小白轻松上手使用】

Mac分享吧 文章目录 Bartender 5 for Mac 菜单栏管理软件 安装完成&#xff0c;软件打开效果一、Bartender 5 菜单栏管理软件 Mac电脑版——v5.2.3⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件3️⃣&#xff1a;打开软件&#xff0c;根据自己…

C#/.NET/.NET Core优秀项目和框架2024年10月简报

前言 每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架&#xff08;每周至少会推荐两个优秀的项目和框架当然节假日除外&#xff09;&#xff0c;推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等&#xff08;打不开或者打开GitHub很慢的同学可以优先查看…

OWASP TOP10 OSS 风险:开源软件安全指南

OWASP OSS 列表提供了旨在绕过 CVE 目录等滞后指标的建议&#xff0c;并为安全从业者提供了安全使用 OSS 组件的指南。 在最近的一些暴露的漏洞和风险之后&#xff0c;对开源软件 &#xff08;OSS&#xff09;的安全和使用方式进行批判性审视的呼声越来越高&#xff0c;特别是 …

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图&#xff08;Symbolic recurrence plots&#xff09;一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术&#xff0c;可用于平稳和非平稳数据集;对噪声具有…

01.如何用DDD重构老项目

学习资料来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 动机DDD与重构实践重构? 重写从一开始就采用DDD重构步骤1. 添加领域模块2.分离出有价值的代码3.迁移到领域模块4.重复2,3 动机 …

【uni-app】创建自定义模板

1. 步骤 打开自定义模板文件夹 在此文件夹下创建模板文件&#xff08;注意后缀名&#xff09; 重新点击“新建页面” 即可看到新建的模板 2. 注意事项 创建的模板必须文件类型对应&#xff08;vue模板就创建*.vue文件, uvue模板就创建*.uvue文件&#xff09;

本地部署开源在线即时通讯软件Fiora打造个人私密聊天室

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 相信大家在聊天时候总是很没安全感&#xff0c;比如在和小姐妹背着男朋友聊一些不能说的坏话&#xff0c;或者背着女朋友和兄…

【开发工具——依赖管理工具——Maven】

1. Maven介绍 Apache Maven 的本质是一个软件项目管理和理解工具。基于项目对象模型 (Project Object Model&#xff0c;POM) 的概念&#xff0c;Maven 可以从一条中心信息管理项目的构建、报告和文档。 对于开发者来说&#xff0c;Maven 的主要作用主要有 3 个&#xff1a; …

bootstrap应用2——计算第n个观测在(or 不在)自助法样本里的概率

#计算第四个观测在自助法样本里的概率 store<-rep(NA,10000) for (i in 1:10000){store[i]<-sum(sample(1:100,repTRUE)4)>0 } #讨论第四个观测 mean(store) #计算第n个观测在自助法样本里的概率 boot <- function(n, N){return(1-(1-1/N)^N) }#计算第n个观测在自助…

基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!

往期精彩内容&#xff1a; Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…

Docker可视化工具 Portainer 安装及配置

文章目录 拉取镜像安装和启动容器访问 Portainer设置密码完后即代表安装完毕安装完成 拉取镜像 rootyx-PowerEdge-R730:~# docker pull portainer/portainer Using default tag: latest latest: Pulling from portainer/portainer Digest: sha256:47b064434edf437badf7337e516…

废品回收小程序搭建,互联网回收行业的特点

随着社会经济的快速发展&#xff0c;人们的生活水平大幅提高&#xff0c;废品、可回收物也在逐年增加&#xff0c;为行业的发展提高了基础。同时&#xff0c;国家对回收行业的扶持力度在不断增加&#xff0c;废品回收市场拥有广阔的发展机遇。对于入局者来说&#xff0c;行业隐…

【JAVA 笔记】08 ch05_program_control_structure

第5章 程序控制结构 程序流程控制介绍 if 分支 switch 分支结构 for 循环控制 while 循环控制 do..while 循环控制 跳转控制语句-break 跳转控制语句-continue 跳转控制语句-return 第5章 程序控制结构 程序流程控制介绍 顺序控制 分支控制 循环控制 if 分支 switch 分支结…

配置elk插件安全访问elk前台页面

编辑els配置文件vim elasticsearch.yml,添加以下配置文件 用elk用户&#xff0c;启动els服务 关闭防火墙&#xff0c;查看els启动是否成功&#xff0c;通过是否启动java进程来判断 或者通过查看是否启动9200和9300端口来判断是否启动 交互模式启动密码配置文件interactive表示交…

vscode通过.vscode/launch.json 内置php服务启动thinkphp 应用后无法加载路由解决方法

我们在使用vscode的 .vscode/launch.json Launch built-in server and debug 启动thinkphp应用后默认是未加载thinkphp的路由文件的&#xff0c; 这个就导致了&#xff0c;某些thinkphp的一些url路由无法访问的情况&#xff0c; 如http://0.0.0.0:8000/api/auth.admin/info这…

第三十章 章节练习商品列表组件封装

目录 一、需求说明 二、技术要点 三、完整代码 3.1. main.js 3.2. App.vue 3.3. MyTable.vue 3.4. MyTag.vue 一、需求说明 1. my-tag 标签组件封装 (1) 双击显示输入框&#xff0c;输入框获取焦点 (2) 失去焦点&#xff0c;隐藏输入框 (3) 回显标签信息 (4) 内…