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++ è¯è¨ > å ¶ä»è¿ç®ç¬¦
å ¶ä»è¿ç®ç¬¦
彿°è°ç¨è¿ç®ç¬¦ä¸ºä»»ä½å¯¹è±¡æä¾å½æ°è¯ä¹ã
æ¡ä»¶è¿ç®ç¬¦ï¼éä¿å°ç§°ä¸ºâä¸å æ¡ä»¶âï¼æ£æ¥ç¬¬ä¸è¡¨è¾¾å¼çå¸å°å¼ï¼ç¶åæ ¹æ®å ¶ç»æå¼ï¼æ±å¼å¹¶è¿åç¬¬äºæç¬¬ä¸è¡¨è¾¾å¼ã
å 建ç彿°è°ç¨è¿ç®ç¬¦
彿°è°ç¨è¡¨è¾¾å¼çå½¢å¼ä¸º
E ( A1, A2, A3,... )
|
|||||||||
å ¶ä¸
- E æ¯æå彿°ç表达å¼
- A1, A2, A3,... æ¯å¯è½ä¸ºç©ºçä»»æè¡¨è¾¾å¼çå表ï¼ä½ä¸ºé¿å æ§ä¹ä¸å 许顶å±åºç°éå·è¿ç®ç¬¦ã
æå彿°ç表达å¼å¯ä»¥ä¸º
ç± E ææä»£ç彿°ï¼ææåï¼åå¯ä»¥æ¯éè½½çï¼ç¨éè½½å³è®®è§åå³å®è¦è°ç¨åªä¸ªéè½½ã
è¥ E æå®æå彿°ï¼åå®å¯ä¸ºèï¼è¿ç§æ
åµä¸å°ä»¥è¿è¡æ¶çå¨ææ´¾åè°ç¨è¯¥å½æ°çæç»è¦ç彿°ã
为è°ç¨è¯¥å½æ°ï¼
|
以任æé¡ºåºå¯¹è¡¨è¾¾å¼ |
(C++17 å) |
|
è¡¨è¾¾å¼ |
(C++17 èµ·) |
åä¸ªå½æ°å½¢åä»¥å ¶å¯¹åºå®åï¼è¥éè¦ï¼ç»è¿éå¼è½¬æ¢åï¼åå§åãè¥æ²¡æå¯¹åºå®åï¼å使ç¨å¯¹åºçé»è®¤å®åï¼èè¥å ¶ä¸åå¨åç¨åºéè¯æã妿æè¿è¡çæ¯æå彿°è°ç¨ï¼åå°æåå½å对象ç this æéï¼å¦åä½¿ç¨æ¾å¼è½¬åä¸è¬ï¼è½¬æ¢å°å½æ°ææå¾ ç this æéãå个形åçåå§åå鿝æ¯å¨è°ç¨æ¹çè¯å¢ä¸è¿è¡çï¼è¿æå³çï¼ä¾å¦å½æä¸ªå½¢åçæé 彿°æåºå¼å¸¸æ¶ï¼ä¸ä¼èèå®ä¹äºå½æ°å çå¼å¸¸å¤çåï¼å³ä½¿æ¯å½æ° try åä¹å¦æ¤ãè¥å½æ°ä¸ºåå彿°ï¼å对çç¥å·å½¢åæå¹é çææå®å宿½é»è®¤å®åæåãå½¢åççåææ¯ç»æäºå®ä¹å®ç彿°è¿åæ¶ï¼è¿æ¯å¤å´å ¨è¡¨è¾¾å¼çç»å°¾ï¼æ¯ç±å®ç°å®ä¹çã
彿°è°ç¨è¡¨è¾¾å¼çè¿åç±»åæ¯è¢«éæ©å½æ°çè¿åç±»åï¼ä»¥éæç»å®å³å®ï¼å¿½ç¥ virtual å
³é®è¯ï¼ï¼å³ä½¿å®é
è°ç¨çè¦ç彿°è¿åä¸åçç±»åãè¿å
许è¦ç彿°è¿åå¼ç¨ææéï¼æåæ´¾çäºåºç±»å½æ°æè¿åç±»åçç±»ï¼å³ C++ æ¯æååï¼covariantï¼è¿åç±»åãè¥ E æå®ææå½æ°ï¼åè¿åç±»å为 voidã
|
å½ä¸ä¸ªç±»ç±»å X çå¯¹è±¡è¢«ä¼ éç»å½æ°ï¼æè¢«ä»å½æ°è¿åæ¶ï¼å¦æ X çæ¯ä¸ªå¤å¶æé 彿°ãç§»å¨æé 彿°åææå½æ°åä¸ºå¹³å¡æè¢«å¼ç½®ï¼deleteï¼çï¼å¹¶ä¸ X æ¥æè³å°ä¸ä¸ªæªè¢«å¼ç½®çå¤å¶æç§»å¨æé 彿°ï¼å容许å®ç°åå»ºä¿æå½æ°å½¢åæç»æå¯¹è±¡ç临æ¶å¯¹è±¡ã 临æ¶å¯¹è±¡åå«ä»å½æ°å®åæè¿å弿é ï¼è彿°çå½¢åæè¿å对象çåå§åï¼å¦åä½¿ç¨æªè¢«å¼ç½®ç平塿é 彿°å¯¹ä¸´æ¶å¯¹è±¡è¿è¡å¤å¶ä¸æ ·è¿è¡ï¼å³ä½¿è¯¥æé 彿°æ æ³è®¿é®ï¼æå®å¹¶ä¸ä¼è¢«è¿è¡å¯¹è±¡çå¤å¶æç§»å¨æ¶çéè½½å³è®®æéæ©ï¼ä¹æ¯å¦æ¤ï¼ã è¿å
许å°ç类类åï¼å¦ std::complex æ |
(C++17 èµ·) |
è¥å½æ°è¿åå·¦å¼å¼ç¨æå°å½æ°çå³å¼å¼ç¨ï¼å彿°è°ç¨è¡¨è¾¾å¼çå¼ç±»å«ä¸ºå·¦å¼ï¼è¥å½æ°è¿åå°å¯¹è±¡çå³å¼å¼ç¨ï¼åå¼ç±»å«ä¸ºäº¡å¼ï¼å¦åå¼ç±»å«ä¸ºçº¯å³å¼ãè¥å½æ°è°ç¨è¡¨è¾¾å¼ä¸ºå¯¹è±¡ç±»åç纯å³å¼ï¼åå®å¿
é¡»æ¥æå®æ´å¯¹è±¡ç±»åï¼é¤é该纯å³å¼ä¸ä¼è¢«å®è´¨åï¼æ¯å¦ (C++17 èµ·)ç¨ä½ decltype çæä½æ°ï¼æç¨ä½ä½ä¸º decltype æä½æ°çå
建éå·è¿ç®ç¬¦è¡¨è¾¾å¼ç峿使°ã
彿°è°ç¨è¡¨è¾¾å¼å¨è¯æ³ä¸ä¸å¼åå§å T()ï¼å½æ°é£æ ¼è½¬åè¡¨è¾¾å¼ T(A1)ï¼ä»¥å临æ¶éçç´æ¥åå§å T(A1, A2, A3, ...) ç¸ä¼¼ï¼å
¶ä¸ T æ¯ä¸ä¸ªç±»åçåç§°ã
#include <cstdio> struct S { int f1(double d) { return printf("%f \n", d); // åå彿°è°ç¨ } int f2() { return f1(7); // æå彿°è°ç¨ï¼å this->f1() // æ´æ°å½¢å转æ¢ä¸º double } }; void f() { puts("function called"); // 彿°è°ç¨ } int main() { f(); // 彿°è°ç¨ S s; s.f2(); // æå彿°è°ç¨ }
è¾åºï¼
function called 7.000000
å 建çéå·è¿ç®ç¬¦
éå·è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
E1 , E2
|
|||||||||
éå·è¡¨è¾¾å¼ E1, E2 ä¸ï¼å¯¹ E1 æ±å¼å¹¶èå¼å
¶ç»æï¼å°½ç®¡å½å®å
·æç±»ç±»åæ¶ï¼ç´å°å
å«å®çå
¨è¡¨è¾¾å¼çç»å°¾ä¹åé½ä¸ä¼éæ¯å®ï¼ï¼å
¶å¯ä½ç¨å¨è¡¨è¾¾å¼ E2 çæ±å¼å¼å§åå®æï¼æ³¨æï¼ç¨æ·å®ä¹ç operator, ä¸è½ä¿è¯å®åºï¼ (C++17 å)ã
éå·è¡¨è¾¾å¼ç»æçç±»åãå¼åå¼ç±»å«ä¸¥æ ¼ä¸ºå
¶ç¬¬äºæä½æ° E2 çç±»åãå¼åå¼ç±»å«ãè¥ E2 为临æ¶éè¡¨è¾¾å¼ (C++17 èµ·)ï¼å表达å¼çç»æä¸ºè¯¥ä¸´æ¶éè¡¨è¾¾å¼ (C++17 èµ·)ãè¥ E2 为ä½åï¼åç»æä¸ºä½åã
åç§éå·åéå表ï¼ä¾å¦å½æ°å®åå表ï¼f(a, b, c)ï¼ååå§åå¨å表 int a[] = {1,2,3}ï¼å ¶ä¸çéå·é½ä¸æ¯éå·è¿ç®ç¬¦ãè¥éè¦å¨è¿ç§è¯å¢ä¸ä½¿ç¨éå·è¿ç®ç¬¦ï¼åå¿ é¡»å æ¬å·ï¼f(a, (n++, n+b), c)ã
|
以éå·è¡¨è¾¾å¼ä¸ºä¸æ è¡¨è¾¾å¼æ¯è¢«å¼ç¨çã ä¾å¦ï¼ a[b, c] 被å¼ç¨è a[(b, c)] æªè¢«å¼ç¨ã |
(C++20 èµ·) |
è¾åºï¼
n = 2 m = 7
æ¡ä»¶è¿ç®ç¬¦
æ¡ä»¶è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
E1 ? E2 : E3
|
|||||||||
对æ¡ä»¶è¿ç®ç¬¦çç¬¬ä¸æä½æ°æ±å¼å¹¶å°å ¶æè¯å¢è½¬æ¢ä¸º boolãå½ç¬¬ä¸æä½æ°çå¼è®¡ç®åææå¯ä½ç¨å®æä¹åï¼è¥ç»æä¸º trueï¼åæ±å¼ç¬¬äºæä½æ°ãè¥ç»æä¸º falseï¼åæ±å¼ç¬¬ä¸æä½æ°ã
æ¡ä»¶è¡¨è¾¾å¼ E1 ? E2 : E3 çç±»ååå¼ç±»å«æç §ä¸åè§åç¡®å®ï¼
E2 æ E3 å
·æ void ç±»åï¼åä¸åä¹ä¸å¿
须为çï¼å¦åç¨åºéè¯æï¼E2 æ E3ï¼ä½é两è
ï¼ä¸ºï¼å¯å¸¦æ¬å·çï¼throw 表达å¼ãæ¡ä»¶è¿ç®ç¬¦çç»æå
·æå¦ä¸è¡¨è¾¾å¼çç±»ååå¼ç±»å«ãè¥å¦ä¸è¡¨è¾¾å¼ä¸ºä½åï¼åç»æä¸ºä½åãè¿ç§æ¡ä»¶è¿ç®ç¬¦å¸¸ç¨äº C++14 ä¹åç C++11 constexpr ç¼ç¨ã
std::string str = 2+2==4 ? "ok" : throw std::logic_error("2+2Â != 4");
E2 å E3 é½å
·æ void ç±»åï¼å
æ¬ä¸¤è
å为 throw 表达å¼çæ
åµï¼ãç»æä¸º void ç±»åç纯å³å¼ã
2+2==4 ? throw 123 : throw 456;
|
2) å¦åï¼è¥ E2 æ E3 å为å¼ç±»å«ç¸åçæ³å·¦å¼ä½åï¼ç±»ååå«ä¸º cv1 T å cv2 Tï¼åæ¤èå©ä¸çé¨åä¸è®¤ä¸ºä¸ªæä½æ°é½æ¥æ cv T ç±»åï¼å
¶ä¸ cv æ¯ cv1 ä¸ cv2 çåå¹¶ã
|
(C++14 èµ·) |
E2 ä¸ E3 æ¥æä¸åç±»åä¸è³å°æä¸ä¸ªæ¯ï¼å¯æ cv éå®çï¼ç±»ç±»åï¼æé½æ¯åä¸å¼ç±»å«çæ³å·¦å¼ä¸å
·æé¤äº cv é宿§ä¹å¤é½ç¸åçç±»åï¼åå°è¯ç»æéå¼è½¬æ¢åºåï¼å
¶ä¸å¿½ç¥æå访é®ï¼æä½æ°æ¯å¦ä¸ºä½åï¼æè½¬æ¢å½æ°æ¯å¦è¢«å¼ç½®ï¼ (C++14 èµ·)ï¼ä»æ¯ä¸ªæä½æ°è½¬æ¢å°ç±å¦ä¸æä½æ°æç¡®å®çç®æ ç±»åï¼å¦ä¸ææè¿°ãä¸ä¸ªå为 X ç TX ç±»åçæä½æ°ï¼è½ä»¥å¦ä¸æ¹å¼è½¬æ¢æå¦ä¸å为 Y ç TY ç±»åæä½æ°çç®æ ç±»åï¼Y 为左å¼ï¼åç®æ ç±»å为 TY&ï¼ä¸å¼ç¨å¿
é¡»ç´æ¥ç»å®å°å·¦å¼ï¼Y 为亡å¼ï¼åç®æ ç±»å为 TY&&ï¼ä¸å¼ç¨å¿
é¡»ç´æ¥ç»å®ï¼Y 为纯å³å¼ï¼æè¥ä¸¤ä¸ªè½¬æ¢åºå齿 æ³ç»æï¼ä¸ TX å TY è³å°æä¸ä¸ªæ¯ï¼å¯ä¸º cv éå®çï¼ç±»ç±»åï¼TX å TYï¼å¿½ç¥ cv é宿§ï¼ä¸ºç¸å类类åï¼ä¸ TY è³å°æ TX ç cv éå®ï¼åç®æ ç±»å为 TY,TY æ¯ TX çåºç±»ï¼åç®æ ç±»å为带æ TX ç cv éå®ç¬¦ç TY
struct A {}; struct B : A {}; using T = const B; A a = true ? A() : T(); // Y = A(), TY = A, X = T(), TX = const B. ç®æ ç±»å = const A
Y å¨åºç¨å·¦å¼å°å³å¼ãæ°ç»å°æéå彿°å°æéæ å转æ¢å伿çç±»åãE2 ä¸ E3 æ¯åç±»åååå¼ç±»å«çæ³å·¦å¼ï¼åç»æå
·æç¸åçç±»ååå¼ç±»å«ï¼èè¥ E2 ä¸ E3 è³å°æä¸ä¸ªæ¯ä½åï¼åç»æä¸ºä½åãE2 ä¸ E3 å
·æä¸åç±»åï¼ä¸ä¸è
æ¥æï¼å¯ä¸º cv éå®çï¼ç±»ç±»åï¼åå°è¯ç¨ä¸æçåå
建åé彿°å°æä½æ°è½¬æ¢ä¸ºå
建类åï¼å¹¶ä¸ºæ¤å®æ½éè½½å³è®®ãè¥éè½½å³è®®å¤±è´¥ï¼åç¨åºéè¯æãå¦åï¼åºç¨æéæ©ç转æ¢ï¼å¹¶å¨æ¥éª¤ 6 ç¨è½¬æ¢åçæä½æ°å代åæä½æ°ãE2 ä¸ E3 ç°å¨åå
·æç¸åç±»åï¼åç»ææ¯è¯¥ç±»åç纯å³å¼ï¼æä»£ä¸ä¸ªä¸´æ¶å¯¹è±¡ï¼ (C++17 å)å
¶ç»æå¯¹è±¡ (C++17 èµ·)仿±å¼ E1 åéæ©çé£ä¸ªæä½æ°è¿è¡å¤å¶åå§åãE2 ä¸ E3 åå
·æç®æ¯ææä¸¾ç±»åï¼ååºç¨ä¸è¬ç®æ¯è½¬æ¢å°å®ä»¬å为å
Œ
±ç±»åï¼è该类å峿¯ç»æãE2 ä¸ E3 å为æéï¼æä¸ä¸ªæ¯æéèå¦ä¸ä¸ªæ¯ç©ºæé常éï¼ååºç¨æé转æ¢åé宿§è½¬æ¢ï¼å°å®ä»¬å为å
Œ
±ç±»åï¼è该类å峿¯ç»æãE2 ä¸ E3 å为æåæéï¼æä¸ä¸ªæ¯æåæéèå¦ä¸ä¸ªæ¯ç©ºæé常éï¼ååºç¨æåæé转æ¢åé宿§è½¬æ¢ï¼å°å®ä»¬åæå
Œ
±ç±»åï¼è该类å峿¯ç»æãE2 ä¸ E3 å为空æé常éï¼èè³å°æä¸ä¸ªä¸º std::nullptr_t ç±»åï¼åç»æç±»å为 std::nullptr_tã| æ¬èæªå®æ åå ï¼ä»»ä½ä»¤æ¤æ´å¯è¯»ï¼èä¸éæ¼éç¹çæºä¼ï¼é䏿¥æ¥è¯´ï¼ç»æ¯æ¡ä¸ä¸ªä¸è¡çå°ç¤ºä¾ä¼å¤§æè£¨ç |
å¯¹äºæ¯å¯¹æååçç®æ¯ç±»å L å R å¹¶å¯¹äºæ¯ä¸ªç±»å Pï¼å ¶ä¸ P 为æéãæåæéææä½ç¨åæä¸¾ç±»åï¼ä¸å彿°ç¾åå¨ä¸è¿°è§åçæ¥éª¤ 5 åä¸éè½½å³è®®ï¼
| LR operator?:(bool, L, R ); |
||
| P operator?:(bool, P, P ); |
||
å
¶ä¸ LR æ¯ L å R ä¸è¿è¡çä¸è¬ç®æ¯è½¬æ¢çç»æãä¸è½éè½½è¿ç®ç¬¦ â?:âï¼è¿äºå½æ°ç¾ååªä¸ºéè½½å³è®®çç®çåå¨ã
æ¡ä»¶è¿ç®ç¬¦çè¿åç±»å亦è½ä½ä¸ºäºå ç±»åç¹æ§ std::common_type 访é®ã
#include <string> #include <iostream> struct Node { Node* next; int data; // æ·±å¤å¶çå¤å¶æé 彿° Node(const Node& other) : next(other.next ? new Node(*other.next) : NULL) , data(other.data) {} Node(int d) : next(NULL), data(d) {} ~Node() { delete next ; } }; int main() { // ç®åçå³å¼ç¤ºä¾ int n = 1 > 2 ? 10 : 11; // 1 > 2 为 falseï¼æ n = 11 // ç®åçå·¦å¼ç¤ºä¾ int m = 10; (n == m ? n : m) = 7; // n == m 为 falseï¼æ m = 7 std::cout << "n = " << n << "\nm = " << m; // è¾åºç»æ }
è¾åºï¼
n = 11 m = 7
æ ååº
æ ååºä¸è®¸å¤ç±»é½éè½½äº operator()ï¼ä»¥ä½¿å
¶è½è¢«ç¨ä½å½æ°å¯¹è±¡ã
| å é¤å¯¹è±¡ææ°ç» ( std::default_delete<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçå ( std::plus<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçå·® ( std::minus<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçä¹ç§¯ ( std::multiplies<T> çå
¬å¼æå彿°) | |
| è¿å第ä¸ä¸ªå®åé¤ä»¥ç¬¬äºä¸ªå®åçç»æ ( std::divides<T> çå
¬å¼æå彿°) | |
| è¿å第ä¸ä¸ªå®åé¤ä»¥ç¬¬äºä¸ªå®åç使° ( std::modulus<T> çå
¬å¼æå彿°) | |
| è¿åå
¶å®åçé ( std::negate<T> çå
¬å¼æå彿°) | |
| æ£æ¥å®åæ¯å¦ç¸ç ( std::equal_to<T> çå
¬å¼æå彿°) | |
| æ£æ¥å®åæ¯å¦ä¸ç¸ç ( std::not_equal_to<T> çå
¬å¼æå彿°) | |
| æ£æ¥ç¬¬ä¸ä¸ªå®åæ¯å¦å¤§äºç¬¬äºä¸ªå®å ( std::greater<T> çå
¬å¼æå彿°) | |
| æ£æ¥ç¬¬ä¸ä¸ªå®åæ¯å¦å°äºç¬¬äºä¸ªå®å ( std::less<T> çå
¬å¼æå彿°) | |
| æ£æ¥ç¬¬ä¸ä¸ªå®åæ¯å¦å¤§äºæçäºç¬¬äºä¸ªå®å ( std::greater_equal<T> çå
¬å¼æå彿°) | |
| æ£æ¥ç¬¬ä¸ä¸ªå®åæ¯å¦å°äºæçäºç¬¬äºä¸ªå®å ( std::less_equal<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçé»è¾ AND ( std::logical_and<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçé»è¾ OR ( std::logical_or<T> çå
¬å¼æå彿°) | |
| è¿åå
¶å®åçé»è¾ NOT ( std::logical_not<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçæä½ AND çç»æ ( std::bit_and<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçæä½ OR çç»æ ( std::bit_or<T> çå
¬å¼æå彿°) | |
| è¿å两个å®åçæä½ XOR çç»æ ( std::bit_xor<T> çå
¬å¼æå彿°) | |
| è¿å对å
¶æåå¨çè°è¯è°ç¨çç»æçé»è¾è¡¥ ( std::unary_negate<Predicate> çå
¬å¼æå彿°) | |
| è¿å对å
¶æåå¨çè°è¯çè°ç¨çç»æçé»è¾è¡¥ ( std::binary_negate<Predicate> çå
¬å¼æå彿°) | |
| è°ç¨å
¶æåå¨ç彿° ( std::reference_wrapper<T> çå
¬å¼æå彿°) | |
| è°ç¨å
¶ç®æ ( std::function<R(Args...)> çå
¬å¼æå彿°) | |
| ç¨æ¤ locale ç collate å»é¢ä»¥åå
¸åºæ¯è¾ä¸¤ä¸ªå符串 ( std::locale çå
¬å¼æå彿°) | |
æ¯è¾ä¸¤ä¸ª value_type ç±»åçå¼ ( std::map<Key,T,Compare,Allocator>::value_compare çå
¬å¼æå彿°) | |
æ¯è¾ä¸¤ä¸ª value_type ç±»åçå¼ ( std::multimap<Key,T,Compare,Allocator>::value_compare çå
¬å¼æå彿°) | |
| æ§è¡å½æ° ( std::packaged_task<R(Args...)> çå
¬å¼æå彿°) | |
| æ¨è¿å¼æç¶æå¹¶è¿åçæçå¼ ( std::linear_congruential_engine<UIntType,a,c,m> çå
¬å¼æå彿°) | |
| çæåå¸ä¸çä¸ä¸ªéæºæ° ( std::uniform_int_distribution<IntType> çå
¬å¼æå彿°) |
æ ååºä¸çä»»ä½ç±»é½ä¸éè½½éå·è¿ç®ç¬¦ãboost åºå° operator, ç¨äº boost.assignãboost.spirit åå
¶ä»åºãæ°æ®åºè®¿é®åº SOCI 亦éè½½ operator,ã
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 1550 | C++98 | å½å¦ä¸æä½æ°å¹¶é void æ¶Â ?: ä¸ä¸å è®¸ææ¬å·ç throw è¡¨è¾¾å¼ | æ¥åææ¬å·ç throw è¡¨è¾¾å¼ |
| CWG 1560 | C++98 |  ?: ä¸ç void æä½æ°å¯¼è´å¦ä¸æä½æ°ä¸ æ çç±çå·¦å¼å°å³å¼è½¬æ¢ï¼å§ç»äº§çå³å¼ |
带 void ç ?: è½ä¸ºå·¦å¼ |
| CWG 1932 | C++14 |  ?: ä¸ç¼ºå¤±åç±»åä½å | 以åºå±ç±»åå¤ç |
| CWG 1895 | C++14 | ä¸æç¡®å¼ç½®æä¸å¯è®¿é®ç转æ¢å½æ°æ¯å¦é»æ¢Â ?: ç转æ¢ï¼ 䏿ªèèä»åºç±»å°æ´¾ç类纯å³å¼çè½¬æ¢ |
ä¸éè½½å³è®®ç¸ä¼¼çæ¹å¼å¤ç |
åé
| 常è§è¿ç®ç¬¦ | ||||||
|---|---|---|---|---|---|---|
| èµå¼ | èªå¢ èªå |
ç®æ¯ | é»è¾ | æ¯è¾ | æåè®¿é® | å ¶ä» |
|
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
| ç¹æ®è¿ç®ç¬¦ | ||||||
|
static_cast 转æ¢ä¸ä¸ªç±»å为å¦ä¸ç¸å
³ç±»å | ||||||