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>
不需要構造任何東西。