c++ 17 std::optional

news/2024/11/8 16:47:39/

std::optional是C++17引入的一个模板类,旨在表示一个值可能存在或可能不存在,而不是使用特定的标记值或指针(例如nullptr)来表示值的缺失。

以下是std::optional的一些核心概念和用法:

基本用法

你可以用std::optional封装几乎任何类型的值:

std::optional<int> maybeInt;
std::optional<std::string> maybeString;

默认情况下,一个std::optional对象不包含值。

赋值和检索

你可以很容易地为其赋值:

maybeInt = 42;
maybeString = "Hello, World!";

你可以使用has_value()方法检查其是否包含值:

if (maybeInt.has_value()) {// do something with maybeInt
}

或者使用更简洁的方式:

if (maybeInt) {// do something with maybeInt
}

要获取std::optional对象中的值(前提是它有值),可以使用value()方法:

int val = maybeInt.value();

或者使用*运算符:

int val = *maybeInt;

std::nullopt

你可以使用std::nullopt来明确地设置std::optional为没有值的状态:

maybeInt = std::nullopt;

使用场景

  1. 函数返回值:当函数可能不返回有效值时,可以使用std::optional。例如,查找容器中的元素或解析可能失败的字符串。

  2. 成员变量:如果某个类的成员可能有或没有值,可以使用std::optional

警告

  • 调用value()operator*方法获取值时,如果std::optional对象没有值,会抛出std::bad_optional_access异常。

  • 当需要返回或传递可能不存在的复杂对象(如大型结构或类)时,使用std::optional可能会引入额外的开销。在这种情况下,考虑是否其他方法更为合适,例如返回指针(可能为nullptr)。

总的来说,std::optional是一个非常有用的工具,可以帮助开发者在不引入特殊的"空值"或"错误值"的情况下,表示可能的缺失值。


http://www.ppmy.cn/news/1059845.html

相关文章

matlab使用教程(23)—优化函数的参数

本博客向您介绍如何存储或访问向 MATLAB 复合函数&#xff08;如 fzero 或 integral&#xff09;传递的数学函数的额外参数。 MATLAB 复合函数基于某个值范围计算数学表达式。这些函数之所以称为复合函数是因为它们是接受函数句柄&#xff08;函数的指针&#xff09;作为输入…

Postgres数据库,使用序列时,没有按自增序列,而且数值很大

文章目录 前言处理前现象原因如何配置序列搞定&#xff0c;再见 前言 最近写了个全局获取操作日志的注解&#xff0c;写在了一个公共模块。但是奇怪的是在有的服务可以自增&#xff0c;而有的不可以。这回中间的过程咱就不过多描述了。 处理前现象 会生成这种id贼大的 原因…

Python自动化小技巧21——实现PDF转word功能(程序制作)

案例背景 为什么这个年代PDF转word&#xff0c;某wps居然还要收费.....很多软件都可以实现这个功能&#xff0c;但是效果都有好有坏&#xff0c;而且有的还付费&#xff0c;很麻烦。 那就用python实现这个功能吧&#xff0c;然后把代码打包为.exe的程序&#xff0c;这样随便在…

达梦数据库物化视图介绍

概述 本文将介绍达梦数据库物化视图&#xff0c;给出其概念及相关创建、使用示例。 1.物化视图概念 物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本&#xff0c;占用存储空间&#xff0c;即将查询出来的数据存储在数据库中。当所依赖的一个或多个基表的数据…

RTSP/Onvif视频服务器EasyNVR安防视频云服务调用接口录像会被自动删除的问题解决方案

EasyNVR安防视频云服务是基于RTSP/Onvif协议接入的视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。平台丰富灵活的视频能力&#xff0c;可应用在智慧校园、智慧工厂、智慧水利等…

AWS 提示证书签名过期无法自动更新

如果域名没有通过验证的话&#xff0c;证书的过去是没有办法自动更新的。 验证的方式也非常简单&#xff0c;通过下面的配置&#xff0c;把 CNAME添加到你的域名上面&#xff0c;AWS 就可会自动完成验证了。 当添加完成后&#xff0c;AWS 验证需要的时间大致在 30 分钟到 1 个…

鲁棒优化入门(5)—Matlab+Yalmip求解鲁棒优化编程实战

之前的博客&#xff1a;鲁棒优化入门&#xff08;二&#xff09;——基于matlabyalmip求解鲁棒优化问题 去年发布了使用Yalmip工具箱求解鲁棒优化问题的博客之后&#xff0c;陆陆续续有朋友问我相关的问题&#xff0c;有人形容从学习这篇博客到求解论文中的鲁棒优化问题&#x…

算法:modus的acsii码的LRC校验位的计算

1.LRC校验算法C语言程序 序言 近日用到关于LRC检验算法,网上找了很多资料,其描述方式实在不敢恭维,为方便使用者特写下详细的计算过程,希望对你有所帮助。 By 厦大 Jacky 20120814 LRC校验的数据发送格式 起始字符(1个字符)+数据(2n个字符)+校验值(2个字符)+结束字符(…