std::optional是C++17引入的类型安全空值工具,要求显式构造、禁止隐式转换,支持安全访问、移动语义和容器协同,使空值语义清晰且无运行时开销。

std::optional 是 C++17 引入的核心工具,专为“可能有值,也可能没有值”的场景设计,替代裸指针、哨兵值(如 -1、nullptr)或自定义包装类,让空值语义清晰、类型安全、无运行时开销。
构造与初始化:明确表达“有”或“无”
不能用 optional<int> opt = 0;</int> 隐式构造(会编译失败),必须显式表明意图:
-
有值:
std::optional<int> opt{42};</int>或std::optional<int> opt = std::make_optional(42);</int> -
无值:
std::optional<int> opt{};</int>(默认构造)、std::optional<int> opt = std::nullopt;</int>或直接赋值opt = std::nullopt; -
从函数返回: 函数可自然返回
optional<t></t>,调用方立刻知道结果可能缺失,例如:std::optional<:string> find_name(int id) { return (id == 123) ? "Alice" : std::nullopt; }</:string>
安全访问:不崩溃,不猜测
绝不用 opt.value() 直接取值(它在无值时抛出 std::bad_optional_access);推荐以下方式:
-
检查后取值:
if (opt) { use(*opt); }——operator bool()判断是否含值,*解引用获取值 -
带默认值取值:
int x = opt.value_or(-1);—— 有值返回值,否则返回给定默认值 -
就地修改(C++20 起支持,但 C++17 可模拟): 若需在有值时修改,先判空再操作:
if (opt) opt->clear();(对optional<:string></:string>)
与容器和算法协同:避免“无效索引”陷阱
常见于查找操作。例如用 std::map 查键:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~