名稱空間
變體
操作

std::optional

來自 cppreference.com
< cpp‎ | 工具
 
 
 
 
定義於標頭檔案 <optional>
template< class T >
class optional;
(C++17 起)

類模板 std::optional 管理一個可選的包含值,即一個可能存在也可能不存在的值。

optional 的一個常見用例是作為可能失敗的函式的返回值。與其他方法(例如 std::pair<T, bool>)不同,optional 能夠很好地處理構造開銷大的物件,並且更具可讀性,因為它明確表達了意圖。

在任何給定時間,任何 optional 例項要麼**包含一個值**,要麼**不包含一個值**。

如果 optional 包含一個值,則該值保證**巢狀**在 optional 物件內部。因此,optional 物件模擬一個物件,而不是一個指標,儘管定義了 operator*()operator->()

optional 型別的物件被**上下文轉換為 bool** 時,如果物件包含一個值,則轉換返回 true;如果物件不包含值,則返回 false

在以下情況下,optional 物件包含一個值:

  • 物件使用型別為 T 的值或另一個包含值的 optional 進行初始化/賦值。

在以下情況下,optional 物件不包含一個值:

  • 物件被預設初始化。
  • 物件使用型別為 std::nullopt_t 的值或不包含值的 optional 物件進行初始化/賦值。
  • 呼叫了成員函式 reset()

optional 物件是一個**view**,如果它**包含一個值**,則包含一個元素;否則,如果它不包含一個值,則包含零個元素。所包含元素的生命週期與物件繫結。

(C++26 起)

不允許可選的引用、函式、陣列或(可能帶 cv 限定符的)void;如果例項化 optional 時使用此類型別,程式將是非良構的。此外,如果例項化 optional 時使用(可能帶 cv 限定符的)標籤型別 std::nullopt_tstd::in_place_t,程式也將是非良構的。

目錄

[編輯] 模板引數

T - 要管理初始化狀態的值的型別。該型別必須滿足 可析構 的要求(特別是,不允許陣列和引用型別)。

[編輯] 巢狀型別

型別 定義
value_type T
iterator (C++26 起) 實現定義的 舊式隨機訪問迭代器常量表達式迭代器連續迭代器,其 value_typereference 分別是 std::remove_cv_t<T>T&
const_iterator (C++26 起) 實現定義的 舊式隨機訪問迭代器常量表達式迭代器連續迭代器,其 value_typereference 分別是 std::remove_cv_t<T>const T&

容器 的迭代器型別的所有要求也適用於 optionaliterator 型別。

[編輯] 資料成員

T* val 指向包含物件(如果存在)的指標
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造 optional 物件
(公共成員函式) [編輯]
如果存在,銷燬所包含的值
(公共成員函式) [編輯]
賦值內容
(公共成員函式) [編輯]
迭代器
(C++26)
返回指向起始的迭代器
(公共成員函式) [編輯]
(C++26)
返回指向末尾的迭代器
(公共成員函式) [編輯]
觀察器
訪問所包含的值
(公共成員函式) [編輯]
檢查物件是否包含值
(公共成員函式) [編輯]
返回所包含的值
(公共成員函式) [編輯]
如果可用,返回包含的值,否則返回另一個值
(公共成員函式) [編輯]
Monadic operations
(C++23)
如果存在包含的值,則返回給定函式對該值的結果,否則返回空的 optional
(公共成員函式) [編輯]
(C++23)
如果存在包含的值,則返回一個包含轉換後的值的 optional,否則返回一個空的 optional
(公共成員函式) [編輯]
(C++23)
如果 optional 包含值,則返回 optional 本身,否則返回給定函式的結果
(公共成員函式) [編輯]
修改器
交換內容
(公共成員函式) [編輯]
銷燬任何包含的值
(公共成員函式) [編輯]
就地構造包含的值
(公共成員函式) [編輯]

[編輯] 非成員函式

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
比較 optional 物件
(函式模板) [編輯]
建立 optional 物件
(函式模板) [編輯]
特化 std::swap 演算法
(函式模板) [編輯]

[編輯] 輔助類

std::optional 的雜湊支援
(類模板特化) [編輯]
(C++17)
指示 std::optional 不包含值的型別
(類) [編輯]
當檢查式訪問不包含值的 optional 時丟擲的異常
(類) [編輯]

[編輯] 輔助函式

(C++17)
nullopt_t 型別的物件
(常量) [編輯]
原地構造標籤
(標籤)[編輯]

[編輯] 輔助特化

template< class T >
constexpr bool ranges::enable_view<std::optional<T>> = true;
(C++26 起)

ranges::enable_view 特化使得 optional 滿足 view 的要求。

template< class T >
constexpr auto format_kind<std::optional<T>> = range_format::disabled;
(C++26 起)

format_kind 特化停用 optional範圍格式化支援

[編輯] 推導指南

[編輯] 備註

特性測試 標準 特性
__cpp_lib_optional 201606L (C++17) std::optional
202106L (C++23)
(DR20)
完全 constexpr
202110L (C++23) Monadic operations
__cpp_lib_optional_range_support 202406L (C++26) std::optional 的範圍支援

[編輯] 示例

#include <iostream>
#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';
}

輸出

create(false) returned empty
create2(true) returned Godzilla

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 4141 C++17 儲存要求
令人困惑
包含的物件必須
巢狀在 optional 物件中

[編輯] 參閱

(C++17)
一種型別安全的帶判別聯合體
(類模板) [編輯]
(C++17)
儲存任意 可複製構造 型別例項的物件
(類) [編輯]
(C++23)
一個包裝器,包含預期值或錯誤值
(類模板) [編輯]
一個包含單個指定值的 view
(類模板) (自定義點物件)[編輯]
一個不含元素的空 view
(類模板) (變數模板)[編輯]