现代 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 适合表达“没有结果”。如果调用者还需要知道失败原因,就要选择能够携带错误信息的结果类型。不要为了使用新特性而丢失必要的错误说明。
可以继续练习
- 验证空字符串、超出范围的数字和带额外后缀的输入。
- 比较返回可选值与抛异常的调用习惯。
- 阅读 RAII 和对象所有权,让资源的生命周期更明确。
回到 架构示例,看看这些语言知识如何进入实际项目。