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';
}