C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::optional
- 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::declval
std::declval
| å®ä¹äºå¤´æä»¶ <utility>
|
||
| template<class T> typename std::add_rvalue_reference<T>::type declval() noexcept; |
(C++11 èµ·) | |
å°ä»»æç±»å T è½¬æ¢æå¼ç¨ç±»åï¼ä»¤å¨ decltype 表达å¼ä¸ä¸å¿
ç»è¿æé 彿°å°±è½ä½¿ç¨æå彿°ã
é叏卿¨¡æ¿ä¸ä½¿ç¨ declval ï¼æ¨¡æ¿æ¥åçæ¨¡æ¿å®åé常å¯è½æ æé 彿°ï¼ä½æå䏿å彿°ï¼åè¿åæéç±»åã
注æï¼ declval åªè½ç¨äºä¸æ±å¼è¯å¢ï¼ä¸ä¸è¦æ±æå®ä¹ï¼æ±å¼å
嫿¤å½æ°çè¡¨è¾¾å¼æ¯é误ãé常ï¼è¥ odr ä½¿ç¨æ¤å½æ°è¢«åç¨åºä¸ºç
å¼ã
åæ°
ï¼æ ï¼
è¿åå¼
ä¸è½è°ç¨ï¼ä»èå³ä¸è¿åå¼ãè¿åç±»åæ¯ T&& ï¼é¤é T æ¯ï¼å¯æ cv éå®çï¼ void ï¼æ¤æ
åµä¸è¿åç±»åæ¯ T ã
示ä¾
è¿è¡æ¤ä»£ç
#include <utility> #include <iostream>  struct Default { int foo() const { return 1; } };  struct NonDefault { NonDefault() = delete; int foo() const { return 1; } };  int main() { decltype(Default().foo()) n1 = 1; // n1 çç±»åæ¯ int // decltype(NonDefault().foo()) n2 = n1; // éè¯¯ï¼æ é»è®¤æé 彿° decltype(std::declval<NonDefault>().foo()) n2 = n1; // n2 çç±»åæ¯ int std::cout << "n1 = " << n1 << '\n' << "n2 = " << n2 << '\n'; }
è¾åºï¼
n1 = 1 n2 = 1
åé
| decltype 说æç¬¦ | å®ä¹çä»·äºè¡¨è¾¾å¼ç±»åçç±»å(C++11) |
| (C++11)(C++20 ä¸ç§»é¤)(C++17) |
æ¨å¯¼ä»¥ä¸ç»å®åè°ç¨ä¸ä¸ªå¯è°ç¨å¯¹è±¡çç»æç±»å (类模æ¿) |