跳转到内容

C++/STL/optional

维基教科书,自由的教学读本
< C++

<optional>是C++17引入的头文件。主要定义了std::optional类模板。

std::optional

[编辑]

std::optional类模板用于管理一个可能包含的值,即一个值可能存在也可能不存在。 常见用例是可能失败的函数的返回值。

任何optional<T>实例或者包含值或者不包含值。如果包含值,则该值保证在optional对象所占据的内存中分配,不会发生动态内存分配。因此,optional对象模拟了一个对象,而不是模拟了指针,即使它定义了operator*()和operator->() 。

optional不支持引用。

  • 成员类型
    • value_type T
  • 成员函数
    • 构造函数
    • 析构函数:也会析构可能包含的值
    • operator=
    • operator-> 访问包含的值
    • operator* 访问包含的值
    • operator bool 检查是否包含值
    • has_value 检查是否包含值
    • value
    • value_or 返回包含的值,否则返回其他值。
  • 单目运算(C++23)
    • and_then
    • transform
    • or_else
  • 修改器
    • swap
    • reset 析构所包含的对象
    • emplace
  • 非成员函数
    • operator==
    • operator!=
    • operator<
    • operator<=
    • operator>
    • operator>=
    • operator<=>
    • make_optional 创建一个对象
    • std::swap(std::optional)
  • 帮助器类
    • std::hash<std::optional>
    • nullopt_t optional类型的未初始化状态的指示器
    • bad_optional_access 指示不含值的异常
#include <optional>
#include <string>
 
// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b)
{
    if (b)
        return "Godzilla";
    return {};
}
 
// std::nullopt can be used to create any (empty) std::optional
auto create2(bool b)
{
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
 
int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << '\n';
 
    // optional-returning factory functions are usable as conditions of while and if
    if (auto str = create2(true))
        std::cout << "create2(true) returned " << *str << '\n';
}