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