std::optional 的未定义行为

根据 C++ 参考文档,我整理了关于 std::optional::operator* 的格式说明:

std::optional::operator*

功能

通过指针方式访问所包含的值。

原型

constexpr T& operator*() &;
constexpr const T& operator*() const&;
constexpr T&& operator*() &&;
constexpr const T&& operator*() const&&;

返回值

  1. 返回指向所包含值的指针
  2. 返回对所包含值的引用

重要警告:如果 *this 不包含值,则行为未定义

示例代码

std::optional<bool> anOptional;
std::cout << *anOptional << std::endl; // 输出 0,但实际上 anOptional 中并未包含值
                                        // 这是未定义行为!

安全使用建议

当不确定 optional 是否含有值时,请使用 std::optional<T>::value_or

std::optional<bool> anOptional;
std::cout << anOptional.value_or(true) << std::endl; // 安全:输出 1(默认值)

注意事项

  • 使用 operator* 前必须确保 optional 包含值
  • 可通过 has_value() 或直接布尔转换检查是否包含值
  • 推荐使用 value() 成员函数(会在空值时抛出异常)或 value_or() 来安全访问

参考链接:cppreference - std::optional/operator*

posted @ 2025-11-25 13:34  BlackSnow  阅读(0)  评论(0)    收藏  举报