C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- å鿍¡æ¿(C++14 èµ·)
- æ´æ°åé¢é
- èååå§å
- æ¯è¾è¿ç®ç¬¦
- é»è®¤æ¯è¾(C++20 èµ·)
- 转ä¹åºå
- for 循ç¯
- while 循ç¯
- ç¨æ·å®ä¹è½¬æ¢
- SFINAE
- 䏻彿°
- ASCII ç 表
- æ è¯ç¬¦
- ç±»å
- å 忍¡å
- 对象
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- ç±»
- è¿ç®ç¬¦éè½½
- 模æ¿
- å¼å¸¸
- äºå¡æ§å å
- å ä½ç¬¦ç±»å说æç¬¦ (C++11 èµ·)
- decltype 说æç¬¦
- 彿°å£°æ
- final 说æç¬¦ (C++11 èµ·)
- override 说æç¬¦(C++11 èµ·)
- å¼ç¨å£°æ
- ç§»å¨æé 彿°
- ç§»å¨èµå¼è¿ç®ç¬¦
- æä¸¾å£°æ
- constexpr 说æç¬¦(C++11 èµ·)
- å表åå§å (C++11 èµ·)
- æé 彿°ä¸æååå§åå¨å表
- using 声æ
- nullptrï¼æéåé¢é
- åºç¡ç±»å
- ç±»åå«åï¼å«å模ç (C++11 èµ·)
- å½¢åå
- èåä½å£°æ
- å符串åé¢é
- ç¨æ·å®ä¹åé¢é (C++11 èµ·)
- 屿§è¯´æç¬¦åºå(C++11 èµ·)
- Lambda è¡¨è¾¾å¼ (C++11 èµ·)
- noexcept 说æç¬¦ (C++11 èµ·)
- noexcept è¿ç®ç¬¦ (C++11 èµ·)
- alignof è¿ç®ç¬¦(C++11 èµ·)
- alignas 说æç¬¦ (C++11 èµ·)
- åå¨ç±»è¯´æç¬¦
- åºäºèå´ç for å¾ªç¯ (C++11 èµ·)
- static_assert 声æ
- éå¼è½¬æ¢
- 代ç¨è¿ç®ç¬¦è¡¨ç¤º
- èªå¢/èªåè¿ç®ç¬¦
- æå 表达å¼(C++17 èµ·)
- 类模æ¿å®åæ¨å¯¼(C++17 èµ·)
- 模æ¿å½¢å䏿¨¡æ¿å®å
- if è¯å¥
- inline 说æç¬¦
- ç»æåç»å®å£°æ (C++17 èµ·)
- switch è¯å¥
- å符åé¢é
- å½å空é´
- æ±å¼é¡ºåº
- å¤å¶æ¶é¤
- consteval 说æç¬¦ (C++20 èµ·)
- constinit 说æç¬¦ (C++20 èµ·)
- åç¨ (C++20)
- 模å (C++20 èµ·)
- 约æä¸æ¦å¿µ (C++20 èµ·)
- new 表达å¼
- do-while 循ç¯
- continue è¯å¥
- break è¯å¥
- goto è¯å¥
- return è¯å¥
- 卿å¼å¸¸è¯´æ
- throw 表达å¼
- try å
- å½å空é´å«å
- 类声æ
- cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
- é»è®¤åå§å
- å¼åå§å(C++03 èµ·)
- é¶åå§å
- å¤å¶åå§å
- ç´æ¥åå§å
- 常éåå§å
- å¼ç¨åå§å
- å¼ç±»å«
- C++ è¿ç®ç¬¦ä¼å 级
- å¸å°åé¢é
- æµ®ç¹åé¢é
- typedef 说æç¬¦
- æ¾å¼ç±»å转æ¢
- static_cast 转æ¢
- dynamic_cast 转æ¢
- const_cast 转æ¢
- reinterpret_cast 转æ¢
- delete 表达å¼
- æé 彿°ä¸æååå§åå¨å表
- this æé
- 访é®è¯´æç¬¦
- åå 声æ
- virtual 彿°è¯´æç¬¦
- explicit 说æç¬¦
- éææå
- é»è®¤æé 彿°
- å¤å¶æé 彿°
- å¤å¶èµå¼è¿ç®ç¬¦
- ææå½æ°
- 类模æ¿
- 彿°æ¨¡æ¿
- æ¾å¼ï¼å ¨ï¼æ¨¡æ¿ç¹å
- æ±ç¼å£°æ
- C++ çåå²
- ä½ç¨å
- çåæ
- å®ä¹ä¸åä¸å®ä¹è§åï¼ODRï¼
- å忥æ¾
- æéå®çå忥æ¾
- æ éå®çå忥æ¾
- å¦åè§å
- æªå®ä¹è¡ä¸º
- ç¿»è¯é¶æ®µ
- 常é表达å¼
- èµå¼è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æå访é®è¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- typeid è¿ç®ç¬¦
- æé声æ
- æ°ç»å£°æ
- è¯è¨é¾æ¥
- 详述类å说æç¬¦
- é»è®¤å®å
- åé¿å®å
- å®åä¾èµæ¥æ¾
- éè½½å³è®®
- éè½½å½æ°çå°å
- æ³¨å ¥ç±»å
- ééææ°æ®æå
- ééææå彿°
- åµå¥ç±»
- æ´¾çç±»
- 空åºç±»ä¼å
- æ½è±¡ç±»
- ä½å
- è½¬æ¢æé 彿°
- æå模æ¿
- 模æ¿å®åæ¨å¯¼
- é¨å模æ¿ç¹å
- sizeof... è¿ç®ç¬¦
- å¾ å³å
- 彿° try å
- æ©å å½åç©ºé´ std
- åæ¯ç¼©å
- RAII
- ä¸/äº/é¶ä¹æ³å
- PImpl
- é¶å¼éåå
- ç±»å
- éå¼è½¬æ¢
- 注é
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >C++ è¯è¨ > 常é表达å¼
常é表达å¼
å®ä¹è½å¨ç¼è¯æ¶æ±å¼ç表达å¼ã
è¿ç§è¡¨è¾¾å¼è½ç¨åéç±»åæ¨¡æ¿å®åãæ°ç»å¤§å°ï¼å¹¶ç¨äºå ¶ä»è¦æ±å¸¸é表达å¼çè¯å¢ï¼ä¾å¦
int n = 1; std::array<int, n> a1; // é误ï¼n 䏿¯å¸¸éè¡¨è¾¾å¼ const int cn = 2; std::array<int, cn> a2; // OKï¼cn æ¯å¸¸é表达å¼
æ ¸å¿å¸¸é表达å¼
æ ¸å¿ï¼coreï¼å¸¸éè¡¨è¾¾å¼æ¯æ±å¼è¿ç¨ä¸ä¸ä¼å¯¹ä¸åä»»ä¸è æ±å¼ç表达å¼ï¼
thisæéï¼ä½ä½ä¸ºè¯¥è¡¨è¾¾å¼çä¸é¨åæ±å¼çconstexpr彿°æconstexpræé 彿°ä¹ä¸çåä¸ç®- è°ç¨æªå£°æä¸º constexpr ç彿°ï¼ææé 彿°ï¼ç彿°è°ç¨è¡¨è¾¾å¼
constexpr int n = std::numeric_limits<int>::max(); // OKï¼max() æ¯ constexpr constexpr int m = std::time(NULL); // é误ï¼std::time() é constexpr
- 对声æä¸º
constexpr使ªå®ä¹ç彿°è¿è¡ç彿°è°ç¨ - 对
constexpr彿°/æé 彿°æ¨¡æ¿å®ä¾åè¿è¡ç彿°è°ç¨ï¼å ¶ä¸è¯¥å®ä¾åæ æ³æ»¡è¶³ constexpr 彿°/æé 彿°çè¦æ±ã - (C++20 èµ·) 对
constexprè彿°ç彿°è°ç¨ï¼è°ç¨æç¨ç对象ä¸å¯ç¨äºå¸¸é表达å¼ï¼è§åè¿°ï¼ä¸å ¶ç彿å§äºæ¤è¡¨è¾¾å¼ä¹å¤ã - ä¼è¶ åºå®ç°å®ä¹éå¶ç表达å¼
- æ±å¼å¯¼è´ä»»ä½å½¢å¼çæ ¸å¿è¯è¨æªå®ä¹è¡ä¸ºï¼å
å«æç¬¦å·æ´æ°æº¢åºãé¤ä»¥é¶ãæ°ç»è¾¹çå¤çæéç®æ¯çï¼ç表达å¼ãæ¯å¦æ£æµæ ååºçæªå®ä¹è¡ä¸ºæ¯æªææçã
constexpr double d1 = 2.0/1.0; // OK constexpr double d2 = 2.0/0.0; // éè¯¯ï¼æªå®ä¹ constexpr int n = std::numeric_limits<int>::max() + 1; // éè¯¯ï¼æº¢åº int x, y, z[30]; constexpr auto e1 = &y - &x; // éè¯¯ï¼æªå®ä¹ constexpr auto e2 = &z[20] - &z[3]; // OK constexpr std::bitset<2> a; constexpr bool b = a[2]; // UBï¼ä½æ¯å¦æ£æµæªæå®
- (C++17 å)lambda 表达å¼
- å·¦å¼å°å³å¼éå¼è½¬æ¢ï¼é¤éâ¦â¦
- åºç¨å°æä»£å¯ç¨äºå¸¸é表达å¼ï¼è§åè¿°ï¼ç对象çé volatile æ³å·¦å¼ï¼
int main() { const std::size_t tabsize = 50; int tab[tabsize]; // OK ï¼ tabsize æ¯å¸¸éè¡¨è¾¾å¼ // å 为 tabsize å¯ç¨äºå¸¸éè¡¨è¾¾å¼ // å ä¸ºå®æ const éå®çæ´æ°ç±»åï¼ä¸å ¶åå§å卿¯å¸¸éåå§åå¨ Â std::size_t n = 50; const std::size_t sz = n; int tab2[sz]; // éè¯¯ï¼ sz 䏿¯å¸¸éè¡¨è¾¾å¼ // å 为 sz ä¸å¯ç¨äºå¸¸éè¡¨è¾¾å¼ // å ä¸ºå ¶åå§åå¨ä¸æ¯å¸¸éåå§åå¨ } }
- æåºç¨å°æ¥æåé¢ç±»åï¼å¹¶æä»£ç彿å§äºæ¤è¡¨è¾¾å¼çæ±å¼ä¹å çé volatile 对象
- åºç¨å°æä»£å¯ç¨äºå¸¸é表达å¼ï¼è§åè¿°ï¼ç对象çé volatile æ³å·¦å¼ï¼
- 对 union ç䏿´»è·æåæå ¶åå¯¹è±¡å®æ½çå·¦å¼å°å³å¼éå¼è½¬æ¢æä¿®æ¹æä½ï¼å³ä½¿å®ä¸æ´»è·æåå ±äº«å ¬å ±èµ·å§åºå乿¯å¦æ¤ï¼
- (C++20 èµ·) åºç¨å°æ¥æä¸ç¡®å®å¼ç对象çå·¦å¼å°å³å¼éå¼è½¬æ¢
- å¯¹æ´»è·æåï¼è¥åå¨ï¼ä¸º mutable ç union è°ç¨éå¼å®ä¹çå¤å¶/ç§»å¨æé 彿°æå¤å¶/ç§»å¨èµå¼è¿ç®ç¬¦ï¼é¤é该 union 对象çç彿å§äºæ¤è¡¨è¾¾å¼çæ±å¼ä¹å
- (C++17 èµ·) (C++20 å)伿´æ¹ union çæ´»è·æåçèµå¼è¡¨è¾¾å¼ï¼æå¯¹éè½½çèµå¼è¿ç®ç¬¦çè°ç¨
- æä»£å¼ç¨ç±»åçåéææ°æ®æåç æ è¯è¡¨è¾¾å¼ï¼é¤é该å¼ç¨å¯ç¨äºå¸¸é表达å¼ï¼æå ¶çå½å§äºæ¤è¡¨è¾¾å¼çæ±å¼ä¹å
- ä» cv void* 转æ¢å°ä»»ä½å¯¹è±¡æéç±»å
- (C++20 å)
dynamic_cast reinterpret_cast- (C++20 å)伪ææå½æ°è°ç¨
- (C++14 å)èªå¢æèªåè¿ç®ç¬¦
-
(C++14 èµ·) ä¿®æ¹å¯¹è±¡ï¼é¤éè¯¥å¯¹è±¡æ¥æé volatile åé¢ç±»åï¼ä¸å ¶ç彿å§äºæ¤è¡¨è¾¾å¼çæ±å¼ä¹å
constexpr int incr(int& n) { return ++n; } constexpr int g(int k) { constexpr int x = incr(k); // é误ï¼incr(k) 䏿¯æ ¸å¿å¸¸éè¡¨è¾¾å¼ // å 为 k çç彿å§äºè¡¨è¾¾å¼ incr(k) ä¹å¤ return x; } constexpr int h(int k) { int x = incr(k); // OKï¼ä¸è¦æ± x ä»¥æ ¸å¿å¸¸é表达å¼åå§å return x; } constexpr int y = h(1); // OKï¼ä»¥å¼ 2 åå§å y // h(1) æ¯æ ¸å¿å¸¸éè¡¨è¾¾å¼ // å 为 k çç彿å§äºè¡¨è¾¾å¼ h(1) ä¹å
- (C++20 å)åºç¨å°å¤æç±»åæ³å·¦å¼ç
typeidè¡¨è¾¾å¼ - new 表达å¼ï¼é¤ééæ©çåé 彿°æ¯å ¨å±å¯æ¿æ¢åé 彿°ä¸æ¤è¡¨è¾¾å¼çæ±å¼å è§£åé å ¶æåé çåå¨ (C++20 èµ·)
- delete 表达å¼ï¼é¤éå®è§£åé äºæ¤è¡¨è¾¾å¼çæ±å¼å åé çåå¨åºå (C++20 èµ·)
- (C++20 èµ·)è°ç¨ std::allocator<T>::allocate ï¼é¤éäºæ¤è¡¨è¾¾å¼çæ±å¼å è§£åé å ¶æåé çåå¨
- (C++20 èµ·)è°ç¨ std::allocator<T>::deallocate ï¼é¤éå®è§£åé äºæ¤è¡¨è¾¾å¼çæ±å¼å åé çåå¨åºå
- (C++20 èµ·)await è¡¨è¾¾å¼æ yield 表达å¼
- (C++20 èµ·)ç»ææªæå®ä¸è·¯æ¯è¾
- ç»ææªææçç¸çæå ³ç³»è¿ç®ç¬¦
- (C++14 å)èµå¼æå¤åèµå¼è¿ç®ç¬¦
- throw 表达å¼
- (C++20 èµ·) æ±ç¼å£°æ
- å® va_arg çè°ç¨ï¼æ¯å¦è½æ±å¼å® va_start æ¯æªæå®ç
- (C++20 èµ·)伿åºå¼å¸¸ç
dynamic_castætypeidè¡¨è¾¾å¼ - lambda 表达å¼ä¸ï¼æå
thisææåå®ä¹äºè¯¥ lambda ä¹å¤çåéï¼è¥å®æ¯ä¸æ¬¡ ODR å¼ä½¿ç¨void g() { const int n=0; constexpr int j=*&n; // OKï¼lambda 表达å¼ä¹å¤ [=]{ constexpr int i=n; // OKï¼'n' æªè¢« ODR å¼ä½¿ç¨ä¸æªå¨æ¤å¤è¢«ä¿è·ã constexpr int j=*&n;// éè¯æï¼'&n' ODR å¼ä½¿ç¨äº 'n'ã }; }
注æï¼è¥ ODR å¼ä½¿ç¨åçäºå¯¹éå ç彿°è°ç¨ä¸ï¼åå®ä¸æ¶æ
thisæå¤å´åéï¼å ä¸ºå®æè®¿é®çæ¯è¯¥éå çæ°æ®æå// OKï¼'v' ä¸ 'm' 被 ODR å¼ä½¿ç¨ï¼ä½æªåºç°äºåµå¥äº lambda å ç常é表达å¼ä¸ auto monad = [](auto v){return [=]{return v;};}; auto bind = [](auto m){return [=](auto fvm){return fvm(m());};}; // å¨å¸¸éè¡¨è¾¾å¼æ±å¼ä¸ï¼å建对èªå¨å¯¹è±¡çä¿è·æ¯ OK çã static_assert(bind(monad(2))(monad)() == monad(2)());
(C++17 èµ·)
| æ¬èæªå®æ åå ï¼éè¦æ´å¤å°ç¤ºä¾åæ´å°æ åç¨è¯ |
注æï¼æ ¸å¿å¸¸éè¡¨è¾¾å¼æ¬èº«å¹¶æ ä»»ä½ç´æ¥çè¯ä¹å«ä¹ï¼è¡¨è¾¾å¼å¿ 须为ä¸ååéä¹ä¸ï¼æå¯ä»¥å¨ç¹å®è¯å¢ä¸ä½¿ç¨ï¼
å¯ç¨äºå¸¸é表达å¼
ä¸è¿°å表ä¸ï¼åéå¯ç¨äºå¸¸é表达å¼ï¼è¥å®æ¯
- constexpr åéï¼æ
- æ¥æä¸åç±»åç常éåå§åçåé
- å¼ç¨ç±»åï¼æ
- const éå®çæ´æ°ææä¸¾ç±»åã
对象æå¼ç¨å¯ç¨äºå¸¸é表达å¼ï¼è¥å®æ¯
- å¯ç¨äºå¸¸é表达å¼çåéï¼æ
- (C++20 èµ·) 模æ¿å½¢åå¯¹è±¡ï¼æ
- å符串åé¢éå¯¹è±¡ï¼æ
- 以ä¸ä»»ä¸è çé mutable å对象æå¼ç¨æåï¼æ
- é volatile ç const é宿´æ°ç±»ææä¸¾ç±»åçï¼ä»¥å¸¸é表达å¼åå§åç宿´ä¸´æ¶å¯¹è±¡ã
const std::size sz = 10; // sz å¯ç¨äºå¸¸é表达å¼
æ´å常é表达å¼
æ´å常éè¡¨è¾¾å¼æ¯éå¼è½¬æ¢æçº¯å³å¼çæ´åææ ä½ç¨åæä¸¾ç±»åç表达å¼ï¼å ¶ä¸è¢«è½¬æ¢çè¡¨è¾¾å¼æ¯æ ¸å¿å¸¸é表达å¼ãè¥å°ç±»ç±»å表达å¼ç¨å¨æå¾ æ´å常é表达å¼ä¹å¤ï¼å表达å¼å°è¢«æè¯å¢éå¼è½¬æ¢ææ´åææ ä½ç¨åæä¸¾ç±»åã
ä¸åè¯å¢è¦æ±æ´å常é表达å¼ï¼
|
(C++14 å) |
- ä½åé¿åº¦
- åºå±ç±»åæªåºå®æ¶çæä¸¾åå§åå¨
|
(C++14 å) |
- 对é½ã
ç»è½¬æ¢ç常é表达å¼
T ç±»åçç»è½¬æ¢çï¼convertedï¼å¸¸éè¡¨è¾¾å¼æ¯éå¼è½¬æ¢å° T ç±»åç表达å¼ï¼å
¶ä¸è¢«è½¬æ¢åè¡¨è¾¾å¼æ¯å¸¸é表达å¼ï¼ä¸éå¼è½¬æ¢åºååªå«æï¼
- constexpr ç¨æ·å®ä¹è½¬æ¢ï¼æ ç±»è½ç¨äºæå¾ æ´æ°ç±»åä¹å¤ï¼
- å·¦å¼å°å³å¼è½¬æ¢
- æ´åæå
- éçªåæ´å转æ¢
|
(C++17 èµ·) |
- èè¥åçä»»ä½å¼ç¨ç»å®ï¼å宿¯ç´æ¥ç»å®ï¼éæé 临æ¶å¯¹è±¡è ï¼
ä¸åè¯å¢è¦æ±ç»è½¬æ¢ç常é表达å¼ï¼
- case 表达å¼
- åºå±ç±»åå·²åºå®æ¶çæä¸¾é¡¹åå§åå¨
|
(C++14 èµ·) |
- æ´å䏿䏾 (C++17 å)éç±»åæ¨¡æ¿å®åã
æè¯å¢è½¬æ¢ï¼contextually convertedï¼ç bool ç±»å常éè¡¨è¾¾å¼æ¯æè¯å¢è½¬æ¢å° bool ç表达å¼ï¼å ¶ä¸è½¬æ¢åçè¡¨è¾¾å¼æ¯å¸¸é表达å¼ï¼ä¸è½¬æ¢åºååªå«ä¸è¿°è½¬æ¢ã
ä¸åè¯å¢è¦æ±æè¯å¢è½¬æ¢ç bool ç±»å常é表达å¼ï¼
| (C++17 èµ·) |
| (C++20 èµ·) |
常é表达å¼
|
常é表达å¼ï¼constant expressionï¼æ¯
|
(C++14 èµ·) | ||
|
常éè¡¨è¾¾å¼æ¯åé¢å¸¸é表达å¼ï¼å¼ç¨å¸¸é表达å¼ï¼æå°å常é表达å¼ã åé¢å¸¸éè¡¨è¾¾å¼æ¯éæéåé¢ç±»åï¼ç»è¯å¢æè¦æ±ç转æ¢åï¼ç纯å³å¼æ ¸å¿å¸¸é表达å¼ãæ°ç»æç±»ç±»åçåé¢å¸¸é表达å¼è¦æ±æ¯ä¸ªå对象以常é表达å¼åå§åã å¼ç¨å¸¸éè¡¨è¾¾å¼æ¯æä»£å ·æéæå卿ç对象ææä»£å½æ°ç左弿 ¸å¿å¸¸é表达å¼ã å°å常éè¡¨è¾¾å¼æ¯ std::nullptr_t ç±»åææéç±»åï¼ç»è¯å¢æè¦æ±ç转æ¢åï¼ç纯å³å¼æ ¸å¿å¸¸é表达å¼ï¼å®æåå ·æéæå卿çå¯¹è±¡ï¼æåå ·æéæåå¨æçæ°ç»æ«å°¾åä¸ä½ç½®ï¼æå彿°ï¼æä¸ºç©ºæéã |
(C++14 å) |
void test() { static const int a = std::random_device{}(); constexpr const int& ra = a; // OKï¼a æ¯æ³å·¦å¼å¸¸éè¡¨è¾¾å¼ constexpr int ia = a; // é误ï¼a 䏿¯çº¯å³å¼å¸¸éè¡¨è¾¾å¼ Â const int b = 42; constexpr const int& rb = b; // é误ï¼b 䏿¯æ³å·¦å¼å¸¸éè¡¨è¾¾å¼ constexpr int ib = b; // OKï¼b æ¯çº¯å³å¼å¸¸éè¡¨è¾¾å¼ }
注解
|
ä¸å®¹è®¸å®ç°å°åºå½æ°å£°æä¸º 常é表达å¼ä¸ä¸å®¹è®¸å ·åè¿åå¼ä¼åï¼ NRVO ï¼ï¼èè¿åå¼ä¼åï¼ RVO ï¼æ¯å¼ºå¶è¦æ±çã |
(C++14 èµ·) |
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 1313 | C++11 | 容许æªå®ä¹è¡ä¸ºï¼ä¸ç¦æ¢æææéåæ³ | åæ°ç»å çæéåæ³ OK ï¼ç¦æ¢ UB |
| CWG 1952 | C++11 | è¦æ±è¯ææ ååºæªå®ä¹è¡ä¸º | æªæå®æ¯å¦è¯æåº UB |
| CWG 2167 | C++14 | æ±å¼ä¸å±é¨çéæåå¼ç¨ä¼ä»¤æ±å¼ä¸ºé constexpr | å 许éæåå¼ç¨ |
| CWG 2299 | C++11 | <cstdarg> ä¸çå®è½å¦ç¨äºå¸¸éæ±å¼ä¸æç¡® | ç¦æ¢ va_arg ï¼æªæå® va_start
|
åé
constexpr 说æç¬¦
|
说æåéæå½æ°çå¼è½å¨ç¼è¯æ¶è®¡ç®(C++11) |
| (C++11)(C++17 ä¸å¼ç¨)(C++20 ä¸ç§»é¤) |
æ£æ¥ç±»åæ¯å¦ä¸ºåé¢ç±»å (类模æ¿) |