C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::optional
- std::hash <std::optional>
- std::optional<T>::operator->, std::optional<T>::operator*
- std::optional<T>::operator=
- std::optional<T>::optional
- std::optional<T>::~optional
- std::optional<T>::operator bool, std::optional<T>::has_value
- std::optional<T>::value
- std::optional<T>::value_or
- std::optional<T>::emplace
- std::optional<T>::swap
- std::optional<T>::reset
- operator==, !=, <, <=, >, >=, <=>(std::optional)
- std::make_optional
- std::swap(std::optional)
- std::optional çæ¨å¯¼æå¼
- std::nullopt_t
- std::bad_optional_access
- std::nullopt
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- std::any
- std::variant
- æ ¼å¼ååº (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- å忰彿°
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注é
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å·¥å ·åº > std::optional
std::optional
| å®ä¹äºå¤´æä»¶ <optional>
|
||
| template< class T > class optional; |
(C++17 èµ·) | |
ç±»æ¨¡æ¿ std::optional 管çä¸ä¸ªå¯éç容纳å¼ï¼æ¢å¯ä»¥åå¨ä¹å¯ä»¥ä¸åå¨çå¼ã
ä¸ç§å¸¸è§ç optional ä½¿ç¨æ
嵿¯ä¸ä¸ªå¯è½å¤±è´¥ç彿°çè¿åå¼ãä¸å
¶ä»ææ®µï¼å¦ std::pair<T,bool> ç¸æ¯ï¼ optional è¯å¥½å°å¤çæé å¼é髿ç对象ï¼å¹¶æ´å å¯è¯»ï¼å ä¸ºå®æ¾å¼è¡¨è¾¾æå¾ã
ä»»ä½ä¸ä¸ª optional<T> çå®ä¾å¨ç»å®æ¶é´ç¹è¦ä¹å«å¼ï¼è¦ä¹ä¸å«å¼ã
è¥ä¸ä¸ª optional<T> å«å¼ï¼åä¿è¯å¼ä½ä¸º optional 对象æç¨ç©ºé´çä¸é¨ååé
ï¼å³ä¸ä¼åç卿å
ååé
ãä»è optional 对象模æä¸ä¸ªå¯¹è±¡ï¼èéæéï¼å°½ç®¡å®ä¹äº operator*() å operator->() è¿ç®ç¬¦ã
å½ä¸ä¸ª optional<T> 对象被æè¯å¢è½¬æ¢æ bool æ¶ï¼è¥å¯¹è±¡å«å¼å转æ¢è¿å true ï¼è¥å¯¹è±¡ä¸å«å¼åè¿å false ã
optional 对象å¨ä¸åæ¡ä»¶ä¸å«å¼ï¼
- 对象被以
Tç±»å弿å¦ä¸å«å¼çoptionalåå§å/èµå¼ã
对象å¨ä¸åæ¡ä»¶ä¸ä¸å«å¼ï¼
- 对象被é»è®¤åå§åã
- 对象被以 std::nullopt_t ç±»å弿ä¸å«å¼ç
optional对象åå§å/èµå¼ã - è°ç¨äºæå彿° reset() ã
æ å¼ç¨ç optional ï¼è¥ä»¥å¼ç¨ç±»åå®ä¾å optional åç¨åºéè¯æãä¸è¿ï¼å¯ç¨ T ç±»åç std::reference_wrapper ç optional ä¿æå¼ç¨ãå¦å¤ï¼è¥ä»¥ï¼å¯æ cv éå®çï¼æ ç¾ç±»å std::nullopt_t æ std::in_place_t å®ä¾å optional åç¨åºéè¯æã
模æ¿å½¢å
| T | - | è¦ä¸ºä¹ç®¡çç¶æçå¼çç±»åã该类åå¿ é¡»æ»¡è¶³å¯ææ (Destructible) çè¦æ±ãï¼ç¹å«æ¯ä¸å 许æ°ç»ç±»åï¼ |
æåç±»å
| Â | |
| æåç±»å | å®ä¹ |
value_type
|
T
|
æå彿°
æé optional对象 (å ¬å¼æå彿°) | |
| éæ¯å®¹çº³çå¼ï¼è¥åå¨ (å ¬å¼æå彿°) | |
| 对å
容èµå¼ (å ¬å¼æå彿°) | |
è§å¯å¨ | |
| è®¿é®æå«å¼ (å ¬å¼æå彿°) | |
| æ£æ¥å¯¹è±¡æ¯å¦å«å¼ (å ¬å¼æå彿°) | |
| è¿åæå«å¼ (å ¬å¼æå彿°) | |
| è¥æå«å¼å¯ç¨åè¿åå®ï¼å¦åè¿åå¦ä¸ä¸ªå¼ (å ¬å¼æå彿°) | |
ä¿®æ¹å¨ | |
| 交æ¢å
容 (å ¬å¼æå彿°) | |
| 鿝任使å«å¼ (å ¬å¼æå彿°) | |
| åä½æé æå«å¼ (å ¬å¼æå彿°) | |
éæå彿°
| (C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) |
æ¯è¾ optional 对象 (彿°æ¨¡æ¿) |
| (C++17) |
å建ä¸ä¸ª optional 对象 (彿°æ¨¡æ¿) |
| (C++17) |
ç¹å std::swap ç®æ³ (彿°) |
è¾ å©ç±»
| (C++17) |
ç¹å std::hash ç®æ³ (类模æ¿ç¹å) |
| (C++17) |
带æªåå§åç¶æç optional ç±»åçæç¤ºå¨ (ç±») |
| (C++17) |
æç¤ºè¿è¡äºå°ä¸å«å¼ç optional çææ£æ¥è®¿é®çå¼å¸¸ (ç±») |
è¾ å©å¯¹è±¡
| (C++17) |
nullopt_t ç±»å对象 (常é) |
| åä½æé æ ç¾ (类模æ¿) |
æ¨å¯¼æå¼
示ä¾
#include <string> #include <functional> #include <iostream> #include <optional>  // optional å¯ç¨ä½å¯è½å¤±è´¥çå·¥åçè¿åç±»å std::optional<std::string> create(bool b) { if(b) return "Godzilla"; else return {}; }  // è½ç¨ std::nullopt å建任ä½ï¼ç©ºçï¼ std::optional auto create2(bool b) { return b ? std::optional<std::string>{"Godzilla"} : std::nullopt; }  // std::reference_wrapper å¯ç¨äºè¿åå¼ç¨ auto create_ref(bool b) { static std::string value = "Godzilla"; return b ? std::optional<std::reference_wrapper<std::string>>{value} : std::nullopt; }  int main() { std::cout << "create(false) returned " << create(false).value_or("empty") << '\n';  // è¿å optional çå·¥å彿°å¯ç¨ä½ while å if çæ¡ä»¶ if (auto str = create2(true)) { std::cout << "create2(true) returned " << *str << '\n'; }  if (auto str = create_ref(true)) { // ç¨ get() è®¿é® reference_wrapper çå¼ std::cout << "create_ref(true) returned " << str->get() << '\n'; str->get() = "Mothra"; std::cout << "modifying it changed it to " << str->get() << '\n'; } }
è¾åºï¼
create(false) returned empty create2(true) returned Godzilla create_ref(true) returned Godzilla modifying it changed it to Mothra
åé
| (C++17 èµ·) |
ç±»åå®å
¨çå¯è¾¨è¯èåä½ (类模æ¿) |
| (C++17 èµ·) |
å¯ä¿æä»»ä½å¯å¤å¶æé (CopyConstructible) ç±»åçå®ä¾ç对象ã (ç±») |