Skip to content

std::optional(C++17)

一句话

一个用来表示“值可能不存在”的容器,比返回 bool 加指针或输出参数更安全、更直观。

头文件

#include <optional>

核心 API 速查

操作签名说明
构造optional()默认构造,不包含值
赋空值optional& operator=(nullopt_t)将状态置为无值
检查含值explicit operator bool() const存在值时返回 true
检查含值bool has_value() const同上
取值T& operator*()解引用获取值(未定义无值时行为)
安全取值T& value()取值,无值时抛出 bad_optional_access
取值或默认T value_or(const T& default_value) const有值返回值,无值返回默认值
就地构造T& emplace(Args&&... args)在原位构造值
重置void reset() noexcept销毁已包含的值

最小示例

cpp
#include <iostream>
#include <optional>
#include <string>

std::optional<std::string> find(bool b) {
    return b ? std::optional<std::string>{"found"} : std::nullopt;
}

int main() {
    auto res = find(false);
    std::cout << res.value_or("not found") << '\n';

    if (auto val = find(true))
        std::cout << *val << '\n';
}

嵌入式适用性:高

  • 零开销抽象,无值时仅占用一个 bool 大小的存储空间,不涉及堆分配
  • 可替代裸指针作为可能失败的函数返回值,避免空指针解引用风险
  • C++17 起即完全支持,C++23 后成员函数全面 constexpr,进一步拓宽适用场景

编译器支持

GCCClangMSVC
待补充待补充待补充

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建