现代 C++ 学习笔记:用 optional 表达可能缺失的结果

· 开发笔记

以 C++17 的 std::optional 为起点,练习显式表达缺失值、检查结果和保持函数接口清楚。

阅读设置

只调整正文大小,仍可使用浏览器缩放。

文章目录

用类型表达“可能没有”

这是一篇学习示例,用于演示技术文章的代码与段落排版。

为什么选择 optional

如果函数返回一个整数,-1 有时被约定为失败,但这个约定需要调用者额外记住。C++17 的 std::optional<T> 可以直接表达“有一个 T,或者没有”。

#include <charconv>
#include <optional>
#include <string_view>
std::optional<int> parse_number(std::string_view text) {
int value = 0;
const auto [end, error] = std::from_chars(
text.data(), text.data() + text.size(), value);
if (error != std::errc{} || end != text.data() + text.size()) {
return std::nullopt;
}
return value;
}

这里用到了结构化绑定与 std::string_view,也都属于 C++17。from_chars 处理转换时不需要通过异常报告格式错误。

调用端明确检查

if (const auto number = parse_number("42")) {
// 已检查有值,可以读取。
use_number(*number); // 示意:由调用方提供的处理函数。
}

示例中的 use_number 是占位的业务函数,不是标准库接口。

缺失值与错误信息

optional 适合表达“没有结果”。如果调用者还需要知道失败原因,就要选择能够携带错误信息的结果类型。不要为了使用新特性而丢失必要的错误说明。

可以继续练习

  1. 验证空字符串、超出范围的数字和带额外后缀的输入。
  2. 比较返回可选值与抛异常的调用习惯。
  3. 阅读 RAII 和对象所有权,让资源的生命周期更明确。

回到 架构示例,看看这些语言知识如何进入实际项目。