`std::optional` 函数返回值
std::optional 是 C++17 中引入的一个模板类,用于表示一个值可能存在也可能不存在的情况。
它可以存储一个值,或者表示没有值的状态,类似于其他编程语言中的“可选”类型。
std::optional主要特性:
- 值的存在性:可以使用
has_value()方法检查std::optional是否包含一个有效的值。 - 访问值:可以使用
value()方法获取存储的值,如果没有值,则会抛出std::bad_optional_access异常。还有value_or(T&& default_value)方法,可以在没有值的情况下返回一个默认值。 - 初始化:可以通过直接赋值、使用构造函数或
std::nullopt来初始化。 - 赋值和重置:可以通过赋值来更新值,也可以使用
reset()方法清除存储的值。
示例代码:
#include <iostream>
#include <optional>
std::optional<int> findValue(bool found) {
if (found) {
return 42; // 返回一个值
}
return std::nullopt; // 返回无值状态
}
int main() {
std::optional<int> opt = findValue(true);
if (opt.has_value()) {
std::cout << "Value: " << opt.value() << std::endl;
} else {
std::cout << "No value found." << std::endl;
}
return 0;
}
在这个示例中,findValue 函数返回一个 std::optional<int>,可以根据条件返回一个整数值或无值状态。这种特性使得处理可能缺失的值更加安全和直观。
std::nullopt
当使用 std::optional 作为函数的返回值时,通常用 std::nullopt 来表示无值状态。这使得函数可以明确地指示操作是否成功以及返回的值是否有效。
示例
以下是一个简单的示例,演示如何使用 std::optional 作为函数返回值:
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> findUserById(int id) {
// 假设我们在一个用户数据库中查找
if (id == 1) {
return "Alice"; // 找到用户,返回姓名
} else {
return std::nullopt; // 未找到用户,返回无值
}
}
int main() {
auto user1 = findUserById(1);
if (user1) {
std::cout << "Found user: " << *user1 << std::endl;
} else {
std::cout << "User not found." << std::endl;
}
auto user2 = findUserById(2);
if (user2) {
std::cout << "Found user: " << *user2 << std::endl;
} else {
std::cout << "User not found." << std::endl;
}
return 0;
}
关键点
返回
std::nullopt:如果函数无法返回有效值,使用return std::nullopt;来表示无值状态。检查返回值:在调用函数后,使用布尔上下文(如
if (user1))检查返回的std::optional是否有值。解引用值:只有在确认有值后,才可以安全地解引用
std::optional的值。
这种方法使得函数可以清晰地表明其执行结果,避免使用特殊值(如 nullptr 或 -1)来表示错误状态,从而提高了代码的可读性和安全性。
{}
在 C++ 中,使用 {} 可以表示无值,但其效果和意图可能不够明确,具体取决于上下文。
对于 std::optional
对于 std::optional,可以使用 {} 来表示无值状态,通常这是有效的,因为 {} 会调用 std::optional 的默认构造函数:
#include <optional>
std::optional<int> opt = {}; // 表示无值
对于 std::variant
对于 std::variant,使用 {} 也是可以的,通常会导致它被初始化为第一个类型(假设你没有定义其他构造),或者被视为 std::monostate(如果它是第一个选项)。
例如:
#include <variant>
using Result = std::variant<std::monostate, int>;
Result result = {}; // 被视为 std::monostate
注意事项
可读性:虽然可以使用
{}表示无值,但这可能会降低代码的可读性。在某些情况下,显式使用std::nullopt(对于std::optional)或std::monostate{}(对于std::variant)会更加清晰。类型安全:确保你清楚
{}在具体上下文中的含义,避免可能的混淆。例如,在std::variant中,{}可能被解释为选择第一个类型。
综上所述,虽然可以使用 {} 来表示无值,但推荐在合适的场景中使用更明确的语义以提高代码的可读性和可维护性。
`std::optional` 函数返回值的更多相关文章
- string类find函数返回值判定
string类find函数返回值判定 代码示例 #include<iostream> #include<cstring> using namespace std; int m ...
- C++ const修饰函数、函数参数、函数返回值
const修饰函数 在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数.为什么不能调用非const函数?因为非const函数可能修改数据成员,cons ...
- C++函数返回值发生的对象复制
最近用QT做一个监控系统的项目,需要显示目标的运动轨迹,每次目标移动后,就在目标的轨迹中(用vector记录)添加一条新轨迹. 但是在运行中画面里一直不出现轨迹,经过调试发现是记录轨迹的函数出错了. ...
- 获得函数返回值类型、参数tuple、成员函数指针中的对象类型
//function_traits.h,获得函数返回值类型.参数tuple.成员函数指针中的对象类型 //参考https://github.com/qicosmos/cosmos/blob/maste ...
- 【C/C++】引用&的含义/语法/作为函数参数/函数返回值/本质/常量引用
含义 引用不产生副本,只是给原变量起了别名. 对引用变量的操作就是对原变量的操作. 基本语法 数据类型 &别名 = 原名 e.g. int a = 10; int &b = a; // ...
- pytho获取C函数返回值
python调用C语言接口 注:本文所有示例介绍基于linux平台 在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题 ...
- shell调用函数返回值深入分析
编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢? 首先shell中调用函数有两种方式: 第一种:value=`functi ...
- Python从线程获取函数返回值
Python中利用强大的threading模块可以很容易的实现多线程开发,提高运行速度.这一般是对某个进行大量计算操作的的函数进行多线程处理,然后合并各线程的结果.获取函数返回值的方法可以如下: 1) ...
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)
C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...
随机推荐
- ArcGIS for Android入门(Java):ViewPage + Fragment 底部导航栏添加地图
修改为ViewPage + Fragment 可以参考里面runoob的教程:我也是参考这个修改的:这前面的网上都有很多相应的教程,我觉得这一部分的难点主要是在Fragment里面加载地图: 在fra ...
- 【Java】找不到此类异常
Java.lang.classNotFoundException 找不到此类异常: java.lang.ClassNotFoundException: org.springframework.web. ...
- 【Vue】Re01 理论概念和入门上手
一.Vue概述 什么是渐进式?1.把Vue作应用的一部分嵌套项目中2.如果完全抛弃其他组件和框架,Vue又具有丰富的生态和库莱支持3.Core + Router + VueX 满足项目绝大多数的需求- ...
- 【Spring-Security】Re12 JsonWebToken
一.认证机制种类: 1.HTTP-Basic-Auth 每次请求接口必须提供账号信息[username + password] 但是信息有暴露风险,配合RestFul风格使用,逐渐淘汰 2.Cooki ...
- 终端无人机武器的克星——部署反无人机干扰机之后 —— 武器AI化势在必行
相关: 观察者网一周军评:俄乌战争对未来无人机发展影响 俄乌战争中无人机有了突出的表现,这种类似巡飞弹的无人机工具有着高可控性.易操作.廉价.易制造等优势,依靠这种攻击性的小型无人机往往具有极高的性价 ...
- MindSpore 初探, 使用LeNet训练minist数据集
如题所述,官网地址: https://www.mindspore.cn/tutorial/zh-CN/r1.2/quick_start.html 数据集下载: mkdir -p ./datasets/ ...
- 【转载】 Ubuntu下使用VSCode的launch.json及tasks.json编写
版权声明:本文为CSDN博主「子木呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_41687938/a ...
- linux终端alacritty导致计算机死机的解决方式——Ubuntu18.04系统Nvidia显卡
如题所述,近日在自己Ubuntu18.04的系统上安装了alacritty终端,安装这个终端主要原因就是可以出现透明桌面,说白了就是漂亮,beautiful,但是这个终端安装后系统就变得极不稳定,经常 ...
- 性能测试面试题大曝光,让你如何迅速拿下 offer!
性能测试面试题精选 1. 以前做过性能测试么?请结合例子具体说明性能测试的流程 面试考察点:性能测试的流程 首选做性能测试的需求分析,明确性能测试的目标.范围.场景和性能指标(如响应时间.吞吐量.并发 ...
- spring创建 JavaWeb