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++ è¯è¨ > æå访é®è¿ç®ç¬¦
æå访é®è¿ç®ç¬¦
访é®å ¶æä½æ°çä¸ä¸ªæåã
| è¿ç®ç¬¦å | è¯æ³ | å¯éè½½ | åå示ä¾ï¼å¯¹äº class T ï¼ | |
|---|---|---|---|---|
| ç±»å®ä¹å | ç±»å®ä¹å¤ | |||
| æ°ç»ä¸æ | a[b]
|
æ¯ | R& T::operator[](const T2& b); | N/A |
é´æ¥å¯»åï¼ç± a ææåçåéï¼
|
*a
|
æ¯ | R& T::operator*(); | R& operator*(T &a); |
| åå°å | &a
|
æ¯ | R* T::operator&(); | R* operator&(T &a); |
| 对象çæå | a.b
|
å¦ | N/A | N/A |
| æéçæå | a->b
|
æ¯ | R* T::operator->() | N/A |
| 对象çæåæé | a.*b
|
å¦ | N/A | N/A |
| æéçæåæé | a->*b
|
æ¯ | R* T::operator->*(R) | R* T::operator->*(T, R) |
| ||||
è§£é
å 建ç䏿 (subscript)è¿ç®ç¬¦æä¾å¯¹å ¶æéææ°ç»æä½æ°ææåç对象ç访é®ã
å 建çé´æ¥å¯»å (indirection)è¿ç®ç¬¦æä¾å¯¹å ¶æéæä½æ°ææåç对象æå½æ°ç访é®ã
å 建çåå°å (address of)è¿ç®ç¬¦å建æåå ¶å¯¹è±¡æå½æ°æä½æ°çæéã
对象çæåå对象çæåæéè¿ç®ç¬¦æä¾å¯¹å ¶å¯¹è±¡æä½æ°çæ°æ®æåææå彿°ç访é®ã
å 建çæéçæååæéçæåæéè¿ç®ç¬¦æä¾å¯¹å ¶æéæä½æ°ææåçç±»çæ°æ®æåææå彿°ç访é®ã
å 建ç䏿 è¿ç®ç¬¦
䏿 è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
expr1 [ expr2 ]
|
(1) | ||||||||
expr1 [ { expr, ... } ]
|
(2) | (C++11) | |||||||
Tãoperator[]å å»ºä¸æ è¡¨è¾¾å¼ E1[E2]ï¼é¤äºæ±å¼é¡ºåºä¹å¤ (C++17 èµ·)ä¸è¡¨è¾¾å¼ *(E1 + E2) ä¸¥æ ¼çåï¼å°±æ¯è¯´ï¼å®éµå¾ªæéç®æ¯çè§åï¼å°æéæä½æ°ï¼å¯ä»¥æ¯æ°ç»å°æé转æ¢çç»æï¼ä½å®å¿ é¡»æåææ°ç»çå ç´ ææ«å°¾åä¸ä½ç½®ï¼è°æ´ä¸ºæååæ°ç»çå¦ä¸å ç´ ï¼ç¶ååè¿è¡è§£å¼ç¨ã
åºç¨å°æ°ç»æ¶ï¼è¥æ°ç»ä¸ºå·¦å¼ï¼å (C++11 èµ·)䏿 表达å¼ä¸ºå·¦å¼ï¼å¦åä¸ºäº¡å¼ (C++11 èµ·)ã
åºç¨å°æéæ¶ï¼ä¸æ 表达å¼å§ç»æ¯å·¦å¼ã
ä¸å
许类å T 为ä¸å®æ´ç±»åï¼å³ä½¿å§ç»ä¸ä¼ä½¿ç¨ T ç大尿å
¶å
é¨ç»æä¹æ¯å¦æ¤ï¼å¦ &x[0]ã
|
以éå·è¡¨è¾¾å¼ä¸ºä¸æ è¡¨è¾¾å¼æ¯è¢«å¼ç¨çã ä¾å¦ï¼ a[b, c] 被å¼ç¨è a[(b, c)] æªè¢«å¼ç¨ã |
(C++20 èµ·) |
å¨å¯¹äºç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯ä¸ªå¯¹è±¡ç±»å Tï¼å¯æ cv éå®ï¼ï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| T& operator[](T*, std::ptrdiff_t); |
||
| T& operator[](std::ptrdiff_t, T*); |
||
#include <iostream> Â int main() { int a[4] = {1, 2, 3, 4}; int* p = &a[2]; std::cout << p[1] << p[-1] << 1[p] << (-1)[p] << '\n'; }
è¾åºï¼
4242
å 建çé´æ¥å¯»åè¿ç®ç¬¦
é´æ¥å¯»åè¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
* expr
|
|||||||||
å å»ºé´æ¥å¯»åè¿ç®ç¬¦çæä½æ°å¿ é¡»æ¯å¯¹è±¡æéæå½æ°æéï¼å ¶ç»æå°±æ¯ expr ææåçæéæå½æ°ã
æåï¼å¯æ cv éå®ï¼ç void çæéä¸è½è§£å¼ç¨ãæåå ¶ä»ä¸å®æ´ç±»åçæéå¯ä»¥è§£å¼ç¨ï¼ä½äº§ççå·¦å¼åªè½å¨å 许ä¸å®æ´ç±»åçè¯å¢ä¸ä½¿ç¨ï¼ä¾å¦åå§åä¸ä¸ªå¼ç¨ã
å¨å¯¹äºç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯ä¸ªè¦ä¹ä¸ºï¼å¯æ cv éå®çï¼å¯¹è±¡ç±»åè¦ä¹ä¸ºï¼æªè¢« const æå¼ç¨éå®çï¼å½æ°ç±»åçç±»å Tï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| T& operator*(T*); |
||
#include <iostream>  int f() { return 42; }  int main() { int n = 1; int* pn = &n;  int& r = *pn; // å·¦å¼å¯ä»¥ç»å®å°å¼ç¨ int m = *pn; // é´æ¥å¯»å + å·¦å¼å°å³å¼è½¬æ¢  int (*fp)() = &f; int (&fr)() = *fp; // 彿°å·¦å¼å¯ä»¥ç»å®å°å¼ç¨ }
å 建çåå°åè¿ç®ç¬¦
åå°åè¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
& 表达å¼
|
(1) | ||||||||
& class :: æå
|
(2) | ||||||||
T çå·¦å¼è¡¨è¾¾å¼æ¶ï¼operator& å建并è¿åä¸ä¸ªæç¸å cv éå®ç T* ç±»åç纯å³å¼ï¼å¹¶æåç±è¯¥æä½æ°æä»£è¡¨ç对象æå½æ°ãå½å
¶æä½æ°å
·æä¸å®æ´ç±»åæ¶ï¼å¯ä»¥æææéï¼ä½è¥è¯¥ä¸å®æ´ç±»åæ°å¥½ä¸ºæä¸ªå®ä¹äºå
¶èªèº«ç operator& çç±»ï¼åå
¶è¡ä¸ºæªå®ä¹ (C++14 å)å使ç¨å
å»ºè¿æ¯éè½½è¿ç®ç¬¦æ¯æªææç (C++14 èµ·)ã对äºå
¶ç±»å带æç¨æ·å®ä¹ç operator& çæä½æ°ï¼å¯ä»¥ä½¿ç¨ std::addressof æ¥è·åçæ£çæéãC ç±»ä¸ç T ç±»åçæå彿°æéææ°æ®æåæéç纯å³å¼ã注æï¼&memberãC::memberï¼çè³ &(C::member) é½ä¸è½ç¨äºåå§åæåæéãå¨å¯¹äºç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼æ¤è¿ç®ç¬¦ä¸å¼å
¥ä»»ä½é¢å¤å½æ°ç¾åï¼è¥åå¨ä½ä¸ºå¯è¡å½æ°çéè½½ operator&ï¼åå
建çååè¿ç®ç¬¦ä¸éç¨ã
void f(int) {} void f(double) {} struct A { int i; }; struct B { void f(); };  int main() { int n = 1; int* pn = &n; // æé int* pn2 = &*pn; // pn2 == pn int A::* mp = &A::i; // æ°æ®æåæé void (B::*mpf)() = &B::f; // æå彿°æé  void (*pf)(int) = &f; // æ ¹æ®åå§åè¯å¢è¿è¡éè½½å³è®® // auto pf2 = &f; // é误ï¼éè½½å½æ°ç±»åææ§ä¹ auto pf2 = static_cast<void (*)(int)>(&f); // ç±äºè½¬åè¿è¡éè½½å³è®® }
å 建çæå访é®è¿ç®ç¬¦
æå访é®è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
è¡¨è¾¾å¼ . template(å¯é) æ è¯è¡¨è¾¾å¼
|
(1) | ||||||||
è¡¨è¾¾å¼ -> template(å¯é) æ è¯è¡¨è¾¾å¼
|
(2) | ||||||||
è¡¨è¾¾å¼ . 伪ææå½æ°
|
(3) | ||||||||
è¡¨è¾¾å¼ -> 伪ææå½æ°
|
(4) | ||||||||
T* ç表达å¼ã两ç§è¿ç®ç¬¦ç第ä¸ä¸ªæä½æ°é½è¢«æ±å¼ï¼å³ä¾¿å®å¹¶ä¸æ¯å¿ é¡»çï¼æ¯å¦å ¶ç¬¬äºä¸ªæä½æ°æåçæ¯éææåï¼ã
两个è¿ç®ç¬¦ç第äºä¸ªæä½æ°æ¯ T æ T çæä¸ªæ æ§ä¹ä¸å¯è®¿é®çåºç±» B çæ°æ®æåææå彿°çååï¼æ£å¼çè¯´æ³æ¯æ è¯è¡¨è¾¾å¼ï¼id-expressionï¼ï¼ï¼å¦ E1.E2 æ E1->E2ï¼ï¼å¹¶å¯éå°æéå®ï¼å¦ E1.B::E2 æ E1->B::E2ï¼ï¼å¯éå°ä½¿ç¨ template æ§ä¹æ¶è§£ç¬¦ï¼å¦ E1.template E2 æ E1->template E2ï¼ã
妿æä¾çæ¯ç¨æ·å®ä¹ç operator->ï¼åéå½å°å¯¹å
¶æè¿åçå¼å次è°ç¨ operator->ï¼ç´å°å°è¾¾è¿åæ®éæéç operator-> 为æ¢ãä¹åå对è¿ä¸ªæééç¨å
建è¯ä¹ã
对äºå 建类åï¼è¡¨è¾¾å¼ E1->E2 ä¸¥æ ¼çä»·äº (*E1).E2ï¼å æ¤ä»¥ä¸è§åä» å¤çäº E1.E2 çæ å½¢ã
å¨è¡¨è¾¾å¼ E1.E2 ä¸ï¼
E2 ä¸ºéææ°æ®æåæ¶ï¼
- 妿
E2å ·æå¼ç¨ç±»åT&æT&&ï¼åå ¶ç»æä¸ºTç±»åçå·¦å¼ï¼ä»£è¡¨E2æä»£è¡¨ç对象æå½æ°ï¼ - å¦åï¼å ¶ç»æä¸ºä»£è¡¨è¯¥éææ°æ®æåçå·¦å¼ã
- åºæ¬ä¸ï¼è¿ä¸¤ç§æ
åµä¸
E1å被æ±å¼éå³è¢«ä¸¢å¼ï¼
E2 为ééææ°æ®æåæ¶ï¼
- 妿
E2å ·æå¼ç¨ç±»åT&æT&&ï¼åå ¶ç»æä¸ºTç±»åçå·¦å¼ï¼ä»£è¡¨E2æä»£è¡¨ç对象æå½æ°ï¼ - å¦åï¼å¦æ
E1为左å¼ï¼åå ¶ç»æä¸ºä»£è¡¨E1çè¿ä¸ªééææ°æ®æåçå·¦å¼ï¼ - å¦åï¼
E1为å³å¼ (C++17 å)亡å¼ï¼å¯è½æ¯ä»çº¯å³å¼å®è´¨åèæ¥ï¼ (C++17 èµ·)ï¼ï¼å ¶ç»æä¸ºä»£è¡¨E1çè¿ä¸ªééææ°æ®æåçå³å¼ (C++11 å)äº¡å¼ (C++11 èµ·)ã
- è¥
E2䏿¯ mutable æåï¼åç»æç cv é宿§æ¯E1åE2ç cv é宿§çåå¹¶ï¼å¦åï¼E2æ¯ mutable æåï¼ä¸ºE1åE2ç volatile é宿§çåå¹¶ï¼
E2 ä¸ºéææå彿°æ¶ï¼å
¶ç»æä¸ºä»£è¡¨è¯¥éææå彿°çå·¦å¼ãåºæ¬ä¸ï¼è¿ç§æ
åµä¸ E1 被æ±å¼éå³è¢«ä¸¢å¼ï¼E2 为ï¼å
æ¬ææå½æ°å¨å
çï¼ééææå彿°æ¶ï¼å
¶ç»æä¸ºä»£è¡¨ E1 çè¿ä¸ªééææå彿°çä¸ç§ç¹æ®ç纯å³å¼ï¼å®åªè½ç¨ä½æå彿°è°ç¨è¿ç®ç¬¦çå·¦æä½æ°ï¼èä¸è½ç¨äºå
¶ä»ç®çï¼E2 为æåæä¸¾é¡¹æ¶ï¼å
¶ç»æä¸ºçäº E1 çè¿ä¸ªæåæä¸¾é¡¹ç纯å³å¼ï¼E1 为æ éç±»åè E2 为ä¸ä¸ª ~ ä¹åè·ç代表ï¼ç§»é¤ cv éå®åï¼ç¸åç±»åçç±»ååæ decltype 说æç¬¦ï¼å¯éå°æé宿¶ï¼å
¶ç»æä¸ºä¸ç§ç¹æ®ç纯å³å¼ï¼å®åªè½ç¨ä½å½æ°è°ç¨è¿ç®ç¬¦çå·¦æä½æ°ï¼èä¸è½ç¨äºå
¶ä»ç®çãæææç彿°è°ç¨è¡¨è¾¾å¼è¢«ç§°ä¸ºä¼ªææå½æ°è°ç¨ï¼pseudo destructor callï¼ãå®ä¸æ¥åä»»ä½å®åï¼è¿å void ï¼æ±å¼ E1 åä¸è¿è¡ä»»ä½æä½ (C++20 å)ç»æå
¶ç»æå¯¹è±¡ççåæ (C++20 èµ·)ãè¿æ¯å¯ä¸ä½¿ operator. çå·¦æä½æ°å
·æé类类åçæ
å½¢ãå
许è¿è¡ä¼ªææå½æ°è°ç¨ï¼ä½¿å¾ç¼åä»£ç æ¶æ é¡»äºè§£æä¸ªç»å®ç±»åæ¯å¦å卿æå½æ°æä¸ºå¯è½ãoperator. ä¸è½éè½½ï¼èå¯¹äº operator-> æ¥è¯´ï¼å¨å¯¹äºç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å
建è¿ç®ç¬¦ä¸å¼å
¥ä»»ä½é¢å¤å½æ°ç¾åï¼è¥åå¨ä½ä¸ºå¯è¡å½æ°çéè½½ operator&ï¼åä¸éç¨å
建ç operator->ã
#include <iostream>  struct P { template<typename T> static T* ptr() { return new T; } };  template<typename T> struct A { A(int n): n(n) {} int n; static int sn; int f() { return 10 + n; } static int sf() { return 4; } class B {}; enum E {RED = 1, BLUE = 2};  void g() { typedef int U; // å¾ å³çæ¨¡æ¿æåéè¦å ³é®è¯ template int* p = P().template ptr<U>(); p->~U(); // U 为 intï¼è°ç¨ int ç伪ææå½æ° delete p; } }; template<> int A<P>::sn = 2;  int main() { A<P> a(1); std::cout << a.n << ' ' << a.sn << ' ' // A::sn ä¹å¯ä»¥å·¥ä½ << a.f() << ' ' << a.sf() << ' ' // A::sf() ä¹å¯ä»¥å·¥ä½ // << a.B << ' ' // é误ï¼ä¸å 许åµå¥ç±»å << a.RED << ' '; // æä¸¾é¡¹ }
è¾åºï¼
1 2 11 4 1
å 建çæåæé访é®è¿ç®ç¬¦
éè¿æåæéè¿è¡çæå访é®è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
lhs .* rhs
|
(1) | ||||||||
lhs ->* rhs
|
(2) | ||||||||
T ç表达å¼ãT* ç表达å¼ã两个è¿ç®ç¬¦çç¬¬äºæä½æ°é½æ¯ç±»å为æå T çï¼æ°æ®æå½æ°ï¼æåæéç±»åï¼æä¸ºæå T çæ æ§ä¹ä¸å¯è®¿é®åºç±» B æåæéç±»åç表达å¼ã
对äºå 建类åï¼è¡¨è¾¾å¼ E1->*E2 ä¸¥æ ¼çä»·äº (*E1).*E2ï¼å æ¤ä»¥ä¸è§åä» å¤çäº E1.*E2 çæ å½¢ã
å¨è¡¨è¾¾å¼ E1.*E2 ä¸ï¼
E2 为æåæ°æ®æåçæéæ¶ï¼
- 妿
E1为左å¼ï¼åå ¶ç»æä¸ºä»£è¡¨è¿ä¸ªæåçå·¦å¼ï¼ - å¦åï¼
E1为å³å¼ (C++17 å)亡å¼ï¼å¯è½æ¯ä»çº¯å³å¼å®è´¨åèæ¥ï¼ (C++17 èµ·)ï¼ï¼å ¶ç»æä¸ºä»£è¡¨è¿ä¸ªæ°æ®æåçå³å¼ (C++11 å)äº¡å¼ (C++11 èµ·)ï¼
E2 为æåæå彿°çæéæ¶ï¼å
¶ç»æä¸ºä»£è¡¨è¿ä¸ªæå彿°çä¸ç§ç¹æ®ç纯å³å¼ï¼å®åªè½ç¨ä½æå彿°è°ç¨è¿ç®ç¬¦çå·¦è¿ç®æ°ï¼èä¸è½ç¨äºå
¶ä»ç®çï¼E2 为空æåæé弿¶ï¼å
¶è¡ä¸ºæªå®ä¹ï¼E1 为å³å¼è E2 æå带æå¼ç¨éå®ç¬¦ & çæå彿°æ¶ï¼ç¨åºéè¯æï¼é¤é该æå彿°äº¦ä¸º const éå®ä½é volatile éå® (C++20 èµ·)ï¼E1 为左å¼è E2 æå带æå¼ç¨éå®ç¬¦ && çæå彿°æ¶ï¼ç¨åºéè¯æãå¨å¯¹äºç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯ä¸ªç±»å D, B, R çç»åï¼å
¶ä¸ç±»ç±»å B æ¯ä¸ D ç¸åçç±»æ D çæ æ§ä¹ä¸å¯è®¿é®åºç±»ï¼è R æ¯å¯¹è±¡æå½æ°ç±»åï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| R& operator->*(D*, R B::*); |
||
å ¶ä¸ä¸¤ä¸ªæä½æ°é½å¯ä»¥æ¯ cv éå®çï¼è¿ç§æ åµä¸è¿åç±»åç cv é宿§æ¯ä¸ªæä½æ°ç cv é宿§çåå¹¶ã
#include <iostream>  struct S { S(int n): mi(n) {} mutable int mi; int f(int n) { return mi + n; } };  struct D: public S { D(int n): S(n) {} };  int main() { int S::* pmi = &S::mi; int (S::* pf)(int) = &S::f;  const S s(7); // s.*pmi = 10; // éè¯¯ï¼æ æ³éè¿ mutable è¿è¡ä¿®æ¹ std::cout << s.*pmi << '\n';  D d(7); // åºç±»çæéå¯ä»¥å¨æ´¾ç类对象ä¸å·¥ä½ D* pd = &d; std::cout << (d.*pf)(7) << ' ' << (pd->*pf)(8) << '\n'; }
è¾åºï¼
7 14 15
æ ååº
è®¸å¤æ å容å¨ç±»é½éè½½äºä¸æ è¿ç®ç¬¦
| è®¿é®æå®çä½ ( std::bitset<N> çå
¬å¼æå彿°) | |
| æä¾å°è¢«ç®¡çæ°ç»çæç´¢å¼è®¿é® ( std::unique_ptr<T,Deleter> çå
¬å¼æå彿°) | |
| è®¿é®æå®å符 ( std::basic_string<CharT,Traits,Allocator> çå
¬å¼æå彿°) | |
| è®¿é®æå®çå
ç´ ( std::array<T,N> çå
¬å¼æå彿°) | |
| è®¿é®æå®çå
ç´ ( std::deque<T,Allocator> çå
¬å¼æå彿°) | |
| è®¿é®æå®çå
ç´ ( std::vector<T,Allocator> çå
¬å¼æå彿°) | |
| è®¿é®ææå
¥æå®çå
ç´ ( std::map<Key,T,Compare,Allocator> çå
¬å¼æå彿°) | |
| è®¿é®ææå
¥æå®çå
ç´ ( std::unordered_map<Key,T,Hash,KeyEqual,Allocator> çå
¬å¼æå彿°) | |
| æç´¢å¼è®¿é®å
ç´ ( std::reverse_iterator<Iter> çå
¬å¼æå彿°) | |
| æç´¢å¼è®¿é®å
ç´ ( std::move_iterator<Iter> çå
¬å¼æå彿°) | |
| è·å/设置 valarray æ°ç»å
ç´ ãåçææ©ç ( std::valarray<T> çå
¬å¼æå彿°) | |
| è¿åæå®çåå¹é
( std::match_results<BidirIt,Alloc> çå
¬å¼æå彿°) |
许å¤è¿ä»£å¨åæºè½æéç±»é½éè½½äºé´æ¥å¯»ååæåè¿ç®ç¬¦
| è§£å¼ç¨æå被管ç对象çæé ( std::unique_ptr<T,Deleter> çå
¬å¼æå彿°) | |
| è§£å¼ç¨åå¨çæé ( std::shared_ptr<T> çå
¬å¼æå彿°) | |
| 访é®è¢«ç®¡ç对象 ( std::auto_ptr<T> çå
¬å¼æå彿°) | |
| è§£å¼ç¨è¿ä»£å¨ ( std::raw_storage_iterator<OutputIt,T> çå
¬å¼æå彿°) | |
| 对éååçåºå±è¿ä»£å¨è¿è¡è§£å¼ç¨ ( std::reverse_iterator<Iter> çå
¬å¼æå彿°) | |
| æ æä½ ( std::back_insert_iterator<Container> çå
¬å¼æå彿°) | |
| æ æä½ ( std::front_insert_iterator<Container> çå
¬å¼æå彿°) | |
| æ æä½ ( std::insert_iterator<Container> çå
¬å¼æå彿°) | |
| (C++20 ä¸å¼ç¨) |
è®¿é®æåçå
ç´ ( std::move_iterator<Iter> çå
¬å¼æå彿°) |
| è¿åå½åå
ç´ ( std::istream_iterator<T,CharT,Traits,Distance> çå
¬å¼æå彿°) | |
| æ æä½ ( std::ostream_iterator<T,CharT,Traits> çå
¬å¼æå彿°) | |
| (C++11 èµ·)(C++17 å) |
è·å¾å½åå符ç坿¬ è¥ CharT æ¥ææåï¼å访é®å½åå符çæå ( std::istreambuf_iterator<CharT,Traits> çå
¬å¼æå彿°) |
| æ æä½ ( std::ostreambuf_iterator<CharT,Traits> çå
¬å¼æå彿°) | |
| 访é®å½åå¹é
( std::regex_iterator<BidirIt,CharT,Traits> çå
¬å¼æå彿°) | |
| 访é®å½ååå¹é
( std::regex_token_iterator<BidirIt,CharT,Traits> çå
¬å¼æå彿°) |
æ ååºä¸çç±»é½æ²¡æéè½½ operator&ãæä¸ºäººæç¥çéè½½ operator& çä¾åæ¯å¾®è½¯ç COM ç±» CComPtrï¼ä½å¨å¦ boost.spirit è¿æ ·ç EDSL ä¸ä¹ä¼åºç°éè½½å®çä¾åã
æ ååºä¸çç±»é½æ²¡æéè½½ operator->*ãæ¾æå»ºè®®å°å
¶ä½ä¸ºæºè½æéæ¥å£çä¸é¨åï¼å¹¶å¨ boost.phoenix ä¸ç actor 䏿å®é
åºç¨ï¼ä½å®å¨å¦ cpp.react è¿æ ·ç EDSL 䏿´ä¸ºå¸¸è§ã
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 1213 | C++11 | æ°ç»å³å¼ç䏿 æä½å¯¼è´å·¦å¼ | éåç±»ä¸ºäº¡å¼ |
åé
| 常è§è¿ç®ç¬¦ | ||||||
|---|---|---|---|---|---|---|
| èµå¼ | èªå¢ èªå |
ç®æ¯ | é»è¾ | æ¯è¾ | æåè®¿é® | å ¶ä» |
|
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
| ç¹æ®è¿ç®ç¬¦ | ||||||
|
static_cast 转æ¢ä¸ä¸ªç±»å为å¦ä¸ç¸å
³ç±»å | ||||||