C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- std::result_of, std::invoke_result
- std::integral_constant
- std::is_constant_evaluated
- std::max_align_t
- offsetof
- NULL
- std::bad_typeid
- std::bad_cast
- std::numeric_limits
- std::type_info
- std::ptrdiff_t
- std::byte
- std::conjunction
- std::disjunction
- std::negation
- std::is_swappable_with, std::is_swappable, std::is_nothrow_swappable_with, std::is_nothrow_swappable
- std::is_invocable, std::is_invocable_r, std::is_nothrow_invocable, std::is_nothrow_invocable_r
- std::is_aggregate
- std::has_unique_object_representations
- std::endian
- std::remove_cvref
- std::type_index
- C æ°å¼æéæ¥å£
- å®å®½æ´æ°ç±»å (C++11 èµ·)
- std::is_bounded_array
- std::is_unbounded_array
- std::size_t
- std::nullptr_t
- std::is_integral
- std::rank
- std::is_void
- std::is_null_pointer
- std::is_array
- std::is_pointer
- std::is_enum
- std::is_union
- std::is_class
- std::is_function
- std::is_object
- std::is_scalar
- std::is_compound
- std::is_floating_point
- std::is_fundamental
- std::is_arithmetic
- std::is_reference
- std::is_lvalue_reference
- std::is_rvalue_reference
- std::is_member_pointer
- std::is_member_object_pointer
- std::is_member_function_pointer
- std::is_const
- std::is_volatile
- std::is_empty
- std::is_polymorphic
- std::is_final
- std::is_abstract
- std::is_trivial
- std::is_trivially_copyable
- std::is_standard_layout
- std::is_literal_type
- std::is_pod
- std::is_signed
- std::is_unsigned
- std::is_constructible, std::is_trivially_constructible, std::is_nothrow_constructible
- std::is_default_constructible, std::is_trivially_default_constructible, std::is_nothrow_default_constructible
- std::is_copy_constructible, std::is_trivially_copy_constructible, std::is_nothrow_copy_constructible
- std::is_move_constructible, std::is_trivially_move_constructible, std::is_nothrow_move_constructible
- std::is_assignable, std::is_trivially_assignable, std::is_nothrow_assignable
- std::is_copy_assignable, std::is_trivially_copy_assignable, std::is_nothrow_copy_assignable
- std::is_move_assignable, std::is_trivially_move_assignable, std::is_nothrow_move_assignable
- std::is_destructible, std::is_trivially_destructible, std::is_nothrow_destructible
- std::has_virtual_destructor
- std::is_same
- std::is_base_of
- std::is_convertible, std::is_nothrow_convertible
- std::is_layout_compatible
- std::is_pointer_interconvertible_base_of
- std::is_pointer_interconvertible_with_class
- std::is_corresponding_member
- std::alignment_of
- std::extent
- std::remove_cv, std::remove_const, std::remove_volatile
- std::add_cv, std::add_const, std::add_volatile
- std::make_signed
- std::make_unsigned
- std::remove_reference
- std::add_lvalue_reference, std::add_rvalue_reference
- std::remove_pointer
- std::add_pointer
- std::remove_extent
- std::remove_all_extents
- std::aligned_storage
- std::aligned_union
- std::decay
- std::enable_if
- std::void_t
- std::conditional
- std::common_type
- std::common_reference
- std::underlying_type
- std::type_identity
- 注é
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼ > std::common_reference
std::common_reference
| å®ä¹äºå¤´æä»¶ <type_traits>
|
||
| template< class... T > struct common_reference; |
(C++20 èµ·) | |
ç¡®å®ç±»å T... çå
±ç¨å¼ç¨ç±»åï¼å³ T... 䏿æç±»åè½è½¬æ¢æç»å®å°çç±»åãè¥è¿ç§ç±»ååå¨ï¼å¦æç
§åè¿°è§åæç¡®å®ï¼ï¼åæå type æå该类åãå¦åï¼æ æå type ãè¥ T... ä¸çä»»ä½ç±»å为ï¼å¯æ cv éå®çï¼ void 以å¤çä¸å®æ´ç±»åï¼åè¡ä¸ºæªå®ä¹ã
ç»å®å¼ç¨ç±»åæ¯ï¼ common_reference è¯å¾å¯»æ¾æææä¾çå¼ç¨ç±»åé½è½ç»å®å°çå¼ç¨ç±»åï¼ä½è¥æ¾ä¸å°è¿ç§å¼ç¨ç±»åï¼åå¯è½è¿åéå¼ç¨ç±»åã
- è¥ sizeof...(T) 为é¶ï¼åæ æå
typeã - è¥ sizeof...(T) 为ä¸ï¼å³
T...ä» å«ä¸ä¸ªç±»åT0ï¼ï¼åæåtypeæåä¸ T0 ç¸åçç±»åã - è¥ sizeof...(T) 为äºï¼å³
T...å«äºä¸ªç±»åT1åT2ï¼ï¼åï¼- è¥
T1åT2齿¯å¼ç¨ç±»åï¼èT1åT2çç®åå ±ç¨å¼ç¨ç±»åSåå¨ï¼åæåç±»åtypeæåSï¼ - å¦åï¼è¥ std::basic_common_reference<std::remove_cvref_t<T1>, std::remove_cvref_t<T2>, T1Q, T2Q>::type åå¨ï¼å
¶ä¸
TiQæ¯ä¸å å«å模æ¿ï¼æ»¡è¶³ TiQ<U> 为U带ä¸Tiç cv åå¼ç¨éå®ç¬¦ï¼åæåç±»åtypeæå该类åï¼ - å¦åï¼è¥ decltype(false? val<T1>() : val<T2>()) æ¯åæ³ç±»åï¼å
¶ä¸
valä¸ºå½æ°æ¨¡æ¿ template<class T> T val(); ï¼åæåç±»åtypeæå该类åï¼ - å¦åï¼è¥ std::common_type_t<T1, T2> ä¸ºåæ³ç±»åï¼åæåç±»å
type代表该类åï¼ - å¦åï¼æ æå
typeã
- è¥
- è¥ sizeof...(T) 大äºäºï¼å³
T...ç±T1, T2, R...ç»æï¼ï¼åè¥ std::common_reference_t<T1, T2> åå¨ï¼ä¸ std::common_reference_t<std::common_reference_t<T1, T2>, R...> åå¨ï¼åæåç±»åtypeæä»£å®ãææå ¶ä»æ åµä¸ï¼æ æåç±»åtypeã
äºä¸ªå¼ç¨ç±»å T1 å T2 çç®åå
±ç¨å¼ç¨ç±»åå®ä¹å¦ä¸ï¼
- è¥
T1为cv1 X &èT2为cv2 Y &ï¼å³é½æ¯å·¦å¼å¼ç¨ï¼ï¼åå ¶ç®åå ±ç¨å¼ç¨ç±»å为 decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()) ï¼å ¶ä¸ cv12 为 cv1 ä¸ cv2 çèåï¼è¥è¯¥ç±»ååå¨ä¸ä¸ºå¼ç¨ç±»åï¼ - è¥
T1aä¸T2å为å³å¼å¼ç¨ç±»åï¼è¥T1 &åT2 &çç®åå ±ç¨å¼ç¨ç±»åï¼æç §å䏿¡ç¡®å®ï¼åå¨ï¼å令C代表该类åç对åºå³å¼å¼ç¨ç±»åãè¥ std::is_convertible_v<T1, C> ä¸ std::is_convertible_v<T2, C> å为trueï¼åT1ä¸T2çç®åå ±ç¨å¼ç¨ç±»å为Cã - å¦åï¼äºä¸ªç±»åä¹ä¸å¿
须为左å¼å¼ç¨ç±»å
A &èå¦ä¸ä¸ªå¿ 须为å³å¼å¼ç¨ç±»åB &&ï¼Aä¸Bå¯ä¸º cv éå®ï¼ã令D代表 A & ä¸ B const & çç®åå ±ç¨å¼ç¨ç±»åï¼è¥å®åå¨ãè¥ D åå¨ä¸ std::is_convertible_v<B &&, D> 为trueï¼åç®åå ±ç¨å¼ç¨ç±»å为Dã - å¦åï¼æ ç®åå ±ç¨å¼ç¨ç±»åã
æåç±»å
| Â | |
| åç§° | å®ä¹ |
type
|
ææ T... çå
±ç¨å¼ç¨ç±»å
|
è¾ å©ç±»å
| template< class... T > using common_reference_t = typename std::common_reference<T...>::type; |
||
| template< class T, class U, template<class> class TQual, template<class> class UQual > struct basic_common_reference { }; |
||
ç±»æ¨¡æ¿ basic_common_reference æ¯å®å¶ç¹ï¼å
è®¸ç¨æ·å½±å common_reference å¯¹ç¨æ·å®ä¹ç±»åï¼å¸¸ä¸ºä»£çå¼ç¨ï¼çç»æãåçæ¨¡æ¿ä¸ºç©ºã
ç¹å
è¥ std::is_same<T, std::decay_t<T>> ä¸ std::is_same<U, std::decay_t<U>> ç为 true ï¼ä¸å®ä»¬è³å°æä¸ä¸ªä¾èµäºç¨åºå®ä¹ç±»åï¼åç¨åºå¯ä»¥å¨åäºä¸ªå½¢å T å U ä¸ç¹å basic_common_reference<T, U, TQual, UQual> ã
è¥è¿ç§ç¹åæ¥æå为 type çæåï¼åå®å¿
é¡»æ¯æå TQual<T> å UQual<U> é½è½è½¬æ¢å°çç±»åçå
¬å¼ä¸æ æ§ä¹çæåç±»åãå¦å¤ï¼ std::basic_common_reference<T, U, TQual, UQual>::type å std::basic_common_reference<U, T, UQual, TQual>::type å¿
须代表åä¸ç±»åã
ç¨åºä¸å¯å¨ç¬¬ä¸æç¬¬åå½¢åä¸ç¹å basic_common_reference ï¼äº¦ä¸å¯ç¹å common_reference èªèº«ã以è¿èè¿äºè§åçæ¹å¼æ·»å ç¹åçç¨åºæ¥ææªå®ä¹è¡ä¸ºã
注æ
| æ¬èæªå®æ |
示ä¾
| æ¬èæªå®æ åå ï¼ææ ç¤ºä¾ |
åé
| (C++11) |
ç¡®å®ä¸ç»ç±»åçå
Œ
±ç±»å (类模æ¿) |
| (C++20) |
æå®ä¸¤ä¸ªç±»åå
±æä¸ä¸ªå
Œ
±å¼ç¨ç±»å (æ¦å¿µ) |