std::optional 介紹

Optionals(也稱為 Maybe 型別)用於表示其內容可能存在或不存在的型別。它們在 C++ 17 中實現為 std::optional 類。例如,std::optional<int> 型別的物件可能包含某些 int 型別的值,或者它可能不包含任何值。

Optionals 通常用於表示可能不存在的值,或者作為無法返回有意義結果的函式的返回型別。

其他可選方法

解決 std::optional 解決的問題有很多其他方法,但它們都不完全:使用指標,使用哨兵或使用 pair<bool, T>

可選 vs 指標

在某些情況下,我們可以提供指向現有物件或 nullptr 的指標來指示失敗。但這僅限於已存在物件的情況 - 作為值型別的 optional 也可用於返回新物件而無需藉助記憶體分配。

可選 vs Sentinel

常用的習慣用法是使用特殊值來表示該值無意義。對於整數型別,這可以是 0 或 -1,對於指標,這可以是 nullptr。但是,這會減少有效值的空間(你無法區分有效值 0 和無意義 0),並且許多型別對於標記值沒有自然選擇。

可選 vs std::pair<bool, T>

另一個常見的習語是提供一對,其中一個元素是 bool,表示該值是否有意義。

這依賴於在錯誤的情況下預設可構造的值型別,這對於某些型別是不可能的並且可能但對於其他型別是不可取的。如果出錯,則 optional<T> 不需要構造任何東西。