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<T>::optional
std::optional<T>::optional
constexpr explicit optional( std::in_place_t,
               std::initializer_list<U> ilist,
template < class U = value_type >
constexpr optional( U&& value );
constexpr optional( U&& value );
(æ¡ä»¶æ§
explicit) æé æ°ç optional 对象ã
1) æé ä¸å«å¼ç对象ã
2) å¤å¶æé 彿°ï¼è¥
other å«å¼ï¼ååå§åæå«å¼ï¼å¦åä»¥è¡¨è¾¾å¼ *other ç´æ¥åå§åï¼ä½ä¸æ¯ç´æ¥å表åå§åï¼ T ç±»å对象ãè¥ other ä¸å«å¼ï¼åæé ä¸ä¸ªä¸å«å¼ç对象ãè¥ std::is_copy_constructible_v<T> 为 false åå®ä¹æ¤æé 彿°ä¸ºè¢«å é¤ãè¥ std::is_trivially_copy_constructible_v<T> 为 true ï¼å宿¯å¹³å¡æé 彿°ã3) ç§»å¨æé 彿°ï¼è¥
other å«å¼ï¼ååå§åæå«å¼ï¼å¦åä»¥è¡¨è¾¾å¼ std::move(*other) ç´æ¥åå§åï¼ä½ä¸æ¯ç´æ¥å表åå§åï¼ T ç±»å对象ï¼ä¸ä¸ä»¤ other 为空ï¼è¢«ç§»å¨æºç optional ä»ç¶å«å¼ï¼ä½è¯¥å¼èªèº«æ¯è¢«ç§»å¨çãè¥ other ä¸å«å¼ï¼åæé ä¸ä¸ªä¸å«å¼çå¯¹è±¡ãæ¤æé 彿°ä¸åä¸éè½½å³è®®ï¼é¤é std::is_move_constructible_v<T> 为 true ãè¥ std::is_trivially_move_constructible_v<T> 为 true ï¼å宿¯å¹³å¡æé 彿°ã4) 转æ¢å¤å¶æé 彿°ï¼è¥
other ä¸å«å¼ï¼åæé ä¸å«å¼ç optional 对象ãå¦åï¼æé å«å¼ç optional 对象ï¼å¦åä»¥è¡¨è¾¾å¼ *other ç´æ¥åå§åï¼ä½ä¸æ¯ç´æ¥å表åå§åï¼ T ç±»å对象ä¸è¬åå§åãæ¤æé 彿°ä¸åä¸éè½½å³è®®ï¼é¤é满足ä¸åæ¡ä»¶ï¼- std::is_constructible_v<T, const U&> 为 true ã
-
Tä¸å¯ä»ä»»ä½ std::optional<U> ï¼å¯ä¸º const ï¼ç±»åè¡¨è¾¾å¼æé æè½¬æ¢ï¼å³ä¸å 8 个类åç¹æ§å为 false ï¼- std::is_constructible_v<T, std::optional<U>&>
- std::is_constructible_v<T, const std::optional<U>&>
- std::is_constructible_v<T, std::optional<U>&&>
- std::is_constructible_v<T, const std::optional<U>&&>
- std::is_convertible_v<std::optional<U>&, T>
- std::is_convertible_v<const std::optional<U>&, T>
- std::is_convertible_v<std::optional<U>&&, T>
- std::is_convertible_v<const std::optional<U>&&, T>
5) 转æ¢ç§»å¨æé 彿°ï¼è¥
other ä¸å«å¼ï¼åæé ä¸å«å¼ç optional 对象ãå¦åï¼æé å«å¼ç optional 对象ï¼å¦åä»¥è¡¨è¾¾å¼ std::move(*other) ç´æ¥åå§åï¼ä½ä¸æ¯ç´æ¥å表åå§åï¼ T ç±»å对象ä¸è¬åå§åãæ¤æé 彿°ä¸åä¸éè½½å³è®®ï¼é¤é满足ä¸åæ¡ä»¶ï¼- std::is_constructible_v<T, U&&> 为 true ã
-
Tä¸å¯ä»ä»»ä½std::optional<U> ï¼å¯ä¸º const ï¼ç±»åè¡¨è¾¾å¼æé æè½¬æ¢ï¼å³ä¸å 8 个类åç¹æ§å为 false ï¼- std::is_constructible_v<T, std::optional<U>&>
- std::is_constructible_v<T, const std::optional<U>&>
- std::is_constructible_v<T, std::optional<U>&&>
- std::is_constructible_v<T, const std::optional<U>&&>
- std::is_convertible_v<std::optional<U>&, T>
- std::is_convertible_v<const std::optional<U>&, T>
- std::is_convertible_v<std::optional<U>&&, T>
- std::is_convertible_v<const std::optional<U>&&, T>
6) æé ä¸ä¸ªå«å¼ç对象ï¼å¦åä»åæ° std::forward<Args>(args)... ç´æ¥åå§åï¼ä½ä¸æ¯ç´æ¥å表åå§åï¼
T ç±»å对象ä¸è¬åå§åãè¥éæ©ç T æé 彿°ä¸º constexpr æé 彿°ï¼åæ¤æé 彿°ä¸º constexpr æé 彿°ãè¯¥å½æ°ä¸åä¸éè½½å³è®®ï¼é¤é std::is_constructible_v<T, Args...> 为 true ã7) æé ä¸ä¸ªå«å¼ç对象ï¼å¦åä»åæ° ilist, std::forward<Args>(args)... ç´æ¥åå§åï¼ä½ä¸æ¯ç´æ¥å表åå§åï¼
T ç±»å对象ä¸è¬åå§åãè¥éæ©ç T æé 彿°ä¸º constexpr æé 彿°ï¼åæ¤æé 彿°ä¸º constexpr æé 彿°ãè¯¥å½æ°ä¸åä¸éè½½å³è®®ï¼é¤é std::is_constructible_v<T, std::initializer_list<U>&, Args&&...> 为 true ã8) æé ä¸ä¸ªå«å¼ç对象ï¼å¦åä»åæ° std::forward<U>(value) ç´æ¥åå§åï¼ä½ä¸æ¯ç´æ¥å表åå§åï¼
T ï¼å
¶ä¸ T 为 value_type ï¼ç±»å对象ä¸è¬åå§åãè¥éæ©ç T æé 彿°ä¸º constexpr æé 彿°ï¼åæ¤æé 彿°ä¸º constexpr æé 彿°ãæ¤æé 彿°ä¸åä¸éè½½å³è®®ï¼é¤é std::is_constructible_v<T, U&&> 为 true ä¸ std::decay_t<U> (C++20 å)std::remove_cvref_t<U> (C++20 èµ·) æ¢é std::in_place_t 亦é std::optional<T> ãæ¤æé 彿°ä¸º explicit ï¼è¥ä¸å¯è¥ std::is_convertible_v<U&&, T> 为 false ãåæ°
| other | - | è¦å¤å¶å
¶æå«å¼çå¦ä¸ optional 对象
|
| value | - | åå§åæå«å¼æç¨çå¼ |
| args... | - | åå§åæå«å¼æç¨çåæ° |
| ilist | - | åå§åæå«å¼æç¨ç initializer_list |
å¼å¸¸
2) æåºä»»ä½
T çæé 彿°ææçå¼å¸¸ã3) æåºä»»ä½
T çæé 彿°ææçå¼å¸¸ãæ¥æä¸å noexcept è§å®ï¼Â Â
noexcept(std::is_nothrow_move_constructible<T>::value)
4-8) æåºä»»ä½
T çæé 彿°ææçå¼å¸¸ã示ä¾
è¿è¡æ¤ä»£ç
#include <optional> #include <iostream> #include <string> int main() { std::optional<int> o1, // 空 o2 = 1, // ä»å³å¼åå§å o3 = o2; // å¤å¶æé 彿°  // è°ç¨ std::string( initializer_list<CharT> ) æé 彿° std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'});  // è°ç¨ std::string( size_type count, CharT ch ) æé 彿° std::optional<std::string> o5(std::in_place, 3, 'A');  // ä» std::string ç§»å¨æé ï¼ç¨æ¨å¯¼æå¼æ¾åç±»å  std::optional o6(std::string{"deduction"});  std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5 << ' ' << *o6 << '\n'; }
è¾åºï¼
1 1 abc AAA deduction
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| P0602R4 | C++17 | å³ä½¿åºå±æé 彿°å¹³å¡ï¼å¤å¶/ç§»å¨æé 彿°äº¦å¯è½ä¸å¹³å¡ | è¦æ±ä¼ æå¹³å¡æ§ |
åé
| (C++17) |
å建ä¸ä¸ª optional 对象 (彿°æ¨¡æ¿) |