std::optional是C++17引入的模板类,用于表示可能无值的情况。它可避免使用特殊值或异常来表达缺失,支持安全访问(如value_or)、判空操作,并适用于返回可能失败的函数,提升代码安全性与可读性。

在C++17中引入的std::optional是一个用于表示“可能包含值,也可能为空”的类型。它非常适合用来处理那些可能没有返回值的函数,避免使用指针或异常来传达“缺失值”的语义。
std::optional<T> 是一个模板类,包装了一个类型为 T 的对象,但这个对象可以不存在。你可以把它理解为“有或没有”——要么持有一个有效值,要么是空状态(用 std::nullopt 表示)。
常见用途包括:
以下是一些常见的使用方式:
立即学习“C++免费学习笔记(深入)”;
1. 创建 optional 对象
#include <optional>
#include <iostream>
std::optional<int> opt1; // 初始为空
std::optional<int> opt2 = std::nullopt; // 明确设为空
std::optional<int> opt3 = 42; // 包含值 42
std::optional<int> opt4{42}; // 同上,推荐写法
if (opt3.has_value()) {
std::cout << "有值:" << opt3.value() << "\n";
}
// 或者像指针一样判断
if (opt3) {
std::cout << "值是:" << *opt3 << "\n";
}
.value():如果无值会抛出 std::bad_optional_access 异常*opt:直接解引用,无值时行为未定义(慎用).value_or(default_value):推荐方式,无值时返回默认值
std::optional<int> opt; int x = opt.value_or(-1); // x == -1 opt = 100; x = opt.value_or(-1); // x == 100
假设我们要实现一个字符串转整数的函数,转换失败时不应返回任意数字。
std::optional<int> str_to_int(const std::string& s) {
try {
size_t pos;
int value = std::stoi(s, &pos);
if (pos == s.size()) {
return value;
}
return std::nullopt;
} catch (...) {
return std::nullopt;
}
}
调用时更清晰:
auto result = str_to_int("123");
if (result) {
std::cout << "转换成功:" << *result << "\n";
} else {
std::cout << "转换失败\n";
}
std::optional 本身有大小开销(通常比原类型多一个字节用于标记是否有效).value(),除非你确定它有值或已捕获异常std::optional<std::reference_wrapper<T>> 替代)基本上就这些。std::optional 让代码更安全、语义更清晰,减少错误处理的复杂性。合理使用能显著提升接口可读性。
以上就是c++++中std::optional怎么使用_c++可选类型optional使用方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号