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++ è¯è¨ > éè½½å³è®®
éè½½å³è®®
为äºç¼è¯å½æ°è°ç¨ï¼ç¼è¯å¨å¿ é¡»é¦å è¿è¡å忥æ¾ï¼å¯¹äºå½æ°å¯è½æ¶ååæ°ä¾èµæ¥æ¾ï¼è对äºå½æ°æ¨¡æ¿å¯è½å鿍¡æ¿å®åæ¨å¯¼ãè¥è¿äºæ¥éª¤äº§çå¤äºä¸ä¸ªåé彿°ï¼åè¿è¡éè½½å³è®®ï¼éæ©å°è¦å®é è°ç¨ç彿°ã
é常æ¥è¯´ï¼æè°ç¨ç彿°æ¯åå½¢åä¸åå®åä¹é´çå¹é æç´§å¯çåé彿°ã
å ³äºå ¶ä»å¯ä»¥åºç°éè½½å½æ°åçè¯å¢ï¼è§éè½½å½æ°çå°åã
è¥å½æ°æ æ³è¢«éè½½å³è®®éæ©ï¼ä¾å¦å®æ¯ææªè¢«æ»¡è¶³çå¶çº¦ç模æ¿åå®ä½ï¼ï¼åä¸è½æåæå使ç¨å®ã
ç»è
éè½½å³è®®å¼å§åï¼å°å忥æ¾å模æ¿å®åæ¨å¯¼æéæ©ç彿°ç»æåé彿°çéåï¼ç¡®åçå¤å«æ ååå³äºåçéè½½å³è®®çè¯å¢ï¼è§ä¸æï¼ã
è¥ä»»ä½åé彿°æ¯æå彿°ï¼éææééæï¼ï¼ä½éæé 彿°ï¼åå°å®å½åå¦å宿ä¸ä¸ªé¢å¤å½¢åï¼éå¼å¯¹è±¡å½¢åï¼ï¼ä»£è¡¨è°ç¨å½æ°æç¨ç对象ï¼å¹¶åºç°å¨é¦ä¸ªå®é å½¢åä¹åã
类似å°ï¼è°ç¨æå彿°æç¨ç对象ï¼ä½ä¸ºéå«å¯¹è±¡å®åï¼åéäºå®åå表ã
对äºç±» X çæå彿°ï¼éå«å¯¹è±¡å½¢åçç±»ååæå彿°ç cv éå®åå¼ç¨éå®å½±åï¼å¦æå彿°ä¸æè¿°ã
就确å®éå¼å¯¹è±¡å½¢åç±»åèè¨ï¼ç¨æ·å®ä¹è½¬æ¢å½æ°è¢«è®¤ä¸ºæ¯éå«å¯¹è±¡å®åçæåã
就确å®éå¼å¯¹è±¡å½¢åç±»åèè¨ï¼ç± using 声æå¼å ¥å°æ´¾çç±»ä¸çæå彿°ï¼è¢«è®¤ä¸ºæ¯æ´¾çç±»çæåã
对äºéææå彿°ï¼å ¶éå¼å¯¹è±¡å½¢å被认为å¹é ä»»ä½å¯¹è±¡ï¼ä¸æ£éªå ¶ç±»åï¼ä¸ä¸ºä¹å°è¯è½¬æ¢åºåã
对äºéè½½å³è®®çå©ä½é¨åï¼éå«å¯¹è±¡å®åä¸å ¶ä»å®åä¸å¯è¾¨å«ï¼ä½ä¸åç¹æ®è§åéç¨äºéå¼å¯¹è±¡å½¢åï¼
struct B { void f(int); }; struct A { operator B&(); }; A a; a.B::f(1); // é误ï¼ä¸è½å¯¹éå¼å¯¹è±¡å½¢åè¿ç¨ç¨æ·å®ä¹è½¬æ¢ static_cast<B&>(a).f(1); // OK
è¥æä»»ä½åé彿°æ¯å½æ°æ¨¡æ¿ï¼åä½¿ç¨æ¨¡æ¿å®åæ¨å¯¼çæå ¶ç¹åï¼å¹¶æè¿ç§ç¹åå½å鿍¡æ¿å½æ°å¯¹å¾ ï¼ä½å¨å³æè§åä¸å¦è¡ææè§å®ãè¥ä¸ä¸ªååæä»£ä¸æå¤ä¸ªå½æ°æ¨¡æ¿ï¼å¹¶ä¸äº¦æä»£éè½½ç鿍¡æ¿å½æ°ï¼åè¿äºå½æ°å仿¨¡æ¿çæçç¹å齿¯åéã
|
è¥æé 彿°æ¨¡æ¿æè½¬æ¢å½æ°æ¨¡æ¿æ¥ææ¡ä»¶æ§ explicit 说æç¬¦ï¼è卿¨å¯¼å宿°å¥½ä¸ºå¼å¾ å³çï¼è¥è¯å¢è¦æ±é explicit çåéèæçæçåé为 explicitï¼åä»åééä¸ç§»é¤å®ã |
(C++20 èµ·) |
åé彿°å表ä¸å§ç»ä¸å å«è¢«å®ä¹ä¸ºå¼ç½®çé¢ç½®ç§»å¨æé 彿°åç§»å¨èµå¼è¿ç®ç¬¦ã
å¨æé æ´¾ç类对象æ¶ï¼åé彿°å表ä¸ä¸å å«ç»§æ¿çå¤å¶åç§»å¨æé 彿°ã
åé彿°
使ç¨éè½½å³è®®çæ¯ç§è¯å¢ï¼é½ä»¥å ¶ç¬æçæ¹å¼åå¤å ¶åé彿°éååå®åå表ï¼
è°ç¨å ·å彿°
è¥ E å¨å½æ°è°ç¨è¡¨è¾¾å¼ E(args) 䏿åéè½½ç彿°å/æå½æ°æ¨¡æ¿ï¼ä½éå¯è°ç¨å¯¹è±¡ï¼çéåï¼åéµå¾ªä¸åè§åï¼
- è¥è¡¨è¾¾å¼
Eå ·æPA->BæA.Bçå½¢å¼ï¼å ¶ä¸ A å ·æç±»ç±»å cv Tï¼ï¼åå°Bä½ä¸ºTçæå彿°æ¥æ¾ãè¯¥æ¥æ¾ææ¾å°ç彿°å£°æå为åé彿°ãå°±éè½½å³è®®èè¨ï¼å®ååè¡¨æ¥æ cv T ç±»åçéå«å¯¹è±¡å®åã - è¥è¡¨è¾¾å¼
E为åç表达å¼ï¼åéµå¾ªå½æ°è°ç¨çæ£å¸¸è§åæ¥æ¾å ¶ååï¼å¯è½æ¶å ADLï¼ãæ¤æ¥æ¾ææ¾å°ç彿°å£°æï¼åå³äºæ¥æ¾ç工使¹å¼ï¼ä¸ºä¸åä¹ä¸ï¼
- a) å ¨é¨æ¯éæå彿°ï¼è¯¥æ åµä¸ï¼å°±éè½½å³è®®èè¨ï¼å®ååè¡¨æ£æ¯å½æ°è°ç¨è¡¨è¾¾å¼ä¸æç¨çå®åå表ï¼
- b) å
¨é¨æ¯æä¸ªç±»
Tçæå彿°ï¼è¯¥æ åµä¸ï¼è¥ this å¨ä½ç¨åä¸ä¸ä¸ºæåTæä»Tæ´¾ççç±»çæéï¼å以*this为éå«å¯¹è±¡å®åãå¦åï¼è¥thisä¸å¨ä½ç¨å䏿䏿åTï¼ï¼ä»¥ä¸ä¸ªTç±»åçèå对象为éå«å¯¹è±¡å®åï¼èè¥éè½½å³è®®ç»§èéæ©äºééææå彿°ï¼åç¨åºéè¯æã
è°ç¨ç±»å¯¹è±¡
è¥ E å¨å½æ°è°ç¨è¡¨è¾¾å¼ E(args) 䏿¥æç±»å cv Tï¼å
- å¨è¡¨è¾¾å¼
(E).operator()çè¯å¢ä¸ï¼å¯¹ååè¿è¡ operator() çéå¸¸æ¥æ¾è·å¾ T ç彿°è°ç¨è¿ç®ç¬¦ï¼å¹¶ææ¯ä¸ªæ¾å°ç彿°å£°ææ·»å å°åé彿°éã - 对äº
TæTçåºç±»ä¸æ¯ä¸ªï¼æªè¢«éèçï¼é explicit çç¨æ·å®ä¹è½¬æ¢å½æ°ï¼ä¸å ¶ cv éå®ç¬¦ä¸Tç cv éå®ç¬¦ç¸åææ´å¤ï¼å¹¶ä¸è¯¥è½¬æ¢å½æ°è½¬æ¢å°ï¼
- 彿°æé
- 彿°æéçå¼ç¨
- 彿°çå¼ç¨
- åå°ä¸ä¸ªæ¥æç¬æåç§°ç代表è°ç¨å½æ°æ·»å å°åé彿°éï¼è¯¥å½æ°çé¦ä¸ªå½¢å为转æ¢ç»æï¼å©ä½åå½¢å为转æ¢ç»æææ¥åçå½¢åå表ï¼èå ¶è¿åç±»å为转æ¢ç»æçè¿åç±»åãè¥åç»§çéè½½å³è®®éæ©æ¤ä»£è¡¨å½æ°ï¼åå°è°ç¨ç¨æ·å®ä¹è½¬æ¢å½æ°ï¼ç¶åè°ç¨è½¬æ¢çç»æã
任使
åµä¸ï¼å°±éè½½å³è®®èè¨çå®ååè¡¨ï¼æ¯å½æ°è°ç¨è¡¨è¾¾å¼çå®åå表ï¼åé¢å ä¸éå«å¯¹è±¡å®å Eï¼å¹é
å°ä»£è¡¨å½æ°æ¶ï¼ç¨æ·å®ä¹è½¬æ¢å°èªå¨å°éå«å¯¹è±¡å®å转æ¢ä¸ºä»£è¡¨å½æ°çé¦ä¸ªå®åï¼ã
int f1(int); int f2(float); struct A { using fp1 = int(*)(int); operator fp1() { return f1; } // 转æ¢å½æ°ï¼å°å½æ°æé using fp2 = int(*)(float); operator fp2() { return f2; } // 转æ¢å½æ°ï¼å°å½æ°æé } a; int i = a(1); // éè¿è½¬æ¢å½æ°è¿åçæéè°ç¨ f1
è°ç¨éè½½è¿ç®ç¬¦
è¥è¡¨è¾¾å¼ä¸æä¸ªè¿ç®ç¬¦çè³å°ä¸ä¸ªå®åå ·æç±»ç±»åææä¸¾ç±»åï¼åå 建è¿ç®ç¬¦åç¨æ·å®ä¹çè¿ç®ç¬¦éè½½é½åä¸éè½½å³è®®ï¼æéæ©çåé彿°éå¦ä¸ï¼
对äºå®åå
·æç±»å T1ï¼ç§»é¤ cv éå®åï¼çä¸å
è¿ç®ç¬¦ @ï¼æå·¦æä½æ°å
·æç±»å T1 è峿使°å
·æç±»å T2ï¼ç§»é¤ cv éå®åï¼çäºå
è¿ç®ç¬¦ @ï¼åå¤ä¸ååé彿°éï¼
T1 æ¯å®æ´ç±»ï¼æå½åæ£å¨å®ä¹çç±»ï¼åæååé鿝坹 T1::operator@ è¿è¡æéå®çå忥æ¾çç»æãææå
¶ä»æ
åµä¸ï¼æååéé为空ãoperator@ è¿è¡æ éå®å忥æ¾ï¼å¯è½æ¶å ADLï¼ææ¾å°çææå£°æï¼ä½å¿½ç¥æå彿°å£°æèä¸å
¶ä¸ä¼é»æ¢å°ä¸ä¸ªå¤å´ä½ç¨åä¸ç»§ç»è¿è¡æ¥æ¾ãè¥äºå
è¿ç®ç¬¦ç两个æä½æ°ï¼æä¸å
è¿ç®ç¬¦çå¯ä¸æä½æ°å
·ææä¸¾ç±»åï¼åæ¥æ¾éä¸ä»
æå½¢åå
·æè¯¥æä¸¾ç±»åï¼æå°è¯¥æä¸¾ç±»åå¼ç¨ï¼ç彿°ï¼æä¸ºéæååé彿°ã|
4) éååéï¼
æææ åµä¸ï¼å¨éå表达å¼çè¯å¢ä¸ä¸èèéååéãå¯¹äºææå ¶ä»è¿ç®ç¬¦ï¼éååéé为空ã |
(C++20 èµ·) |
æäº¤ç»éè½½å³è®®çåé彿°é忝以ä¸éåçå¹¶éãå°±éè½½å³è®®èè¨çå®åå表ç±è¿ç®ç¬¦çåæä½æ°ç»æï¼é¤äº operator-> çæ
åµï¼å
¶ç¬¬äºæä½æ°å¹¶é彿°è°ç¨çå®åï¼è§æå访é®è¿ç®ç¬¦ï¼ã
struct A { operator int(); // ç¨æ·å®ä¹è½¬æ¢ }; A operator+(const A&, const A&); // éæåç¨æ·å®ä¹è¿ç®ç¬¦ void m() { A a, b; a + b; // æååéï¼æ // éæååéï¼operator+(a,b) // å 建åéï¼int(a) + int(b) // éè½½å³è®®éæ© operator+(a,b) }
è¥éè½½å³è®®éæ©äºå 建åéï¼åä»ç±»ç±»åçæä½æ°è¿è¡çç¨æ·å®ä¹è½¬æ¢åºåä¸å è®¸æ¥æç¬¬äºä¸ªæ å转æ¢åºåï¼ç¨æ·å®ä¹è½¬æ¢å½æ°å¿ é¡»ç´æ¥ç»åºæå¾ çæä½æ°ç±»åï¼
struct Y { operator int*(); }; // Y å¯è½¬æ¢ä¸º int* int *a = Y() + 100.0; // éè¯¯ï¼æéå double ä¹é´æ²¡æ operator+
å¯¹äº operator,ãä¸å operator& å operator->ï¼è¥åé彿°é䏿²¡æå¯è¡å½æ°ï¼è§åè¿°ï¼ï¼åå°è¿ç®ç¬¦è§£é为å 建è¿ç®ç¬¦ã
|
è¥å¯¹è¿ç®ç¬¦ è¥å¯¹è¿ç®ç¬¦ï¼ä¸º è¿ç§æ åµä¸çéè½½å³è®®æä¸æ¡å³èè§åï¼å好ééååéçäºéååéï¼ä¸å好éåæéååéçäºåæéååéã è¿ç§å ·æéåºå®åçæ¥æ¾ä½¿å¾å¯ä»¥åªå operator<=>(std::string, const char*) ä¸ operator==(std::string, const char*) å°±çæ std::string å const char* é´çææå忝è¾ãæ´å¤ç»èè§é»è®¤æ¯è¾ã |
(C++20 èµ·) |
ç±æé 彿°åå§å
å½å¯¹ç±»ç±»åç对象è¿è¡ç´æ¥åå§åæå¨å¤å¶åå§åä¹å¤çè¯å¢ä¸è¿è¡é»è®¤åå§åæ¶ï¼åé彿°æ¯æ£å¨åå§åçç±»çæææé 彿°ãå®åå表为åå§åå¨ç表达å¼å表ã
å½å¯¹ç±»ç±»åå¯¹è±¡ä»æä¸ªç¸åææ´¾ç类类åç对象è¿è¡å¤å¶åå§åï¼æå¨å¤å¶åå§åè¯å¢ä¸è¿è¡é»è®¤åå§åæ¶ï¼åé彿°æ¯æ£å¨åå§åçç±»çææè½¬æ¢æé 彿°ãå®åå表æ¯åå§åå¨ç表达å¼ã
éè¿è½¬æ¢è¿è¡å¤å¶åå§å
è¥ç±»ç±»å对象çå¤å¶åå§åè¦æ±è°ç¨æä¸ªç¨æ·å®ä¹è½¬æ¢å½æ°ä»¥å° cv S ç±»åçåå§åå¨è¡¨è¾¾å¼è½¬æ¢ä¸ºæ£å¨åå§åç对象ç cv T ç±»åï¼åä¸å彿°æ¯åé彿°ï¼
-
Tçææè½¬æ¢æé 彿° - ä»
Såå ¶ååºç±»ï¼é¤ééèï¼å°TæTçæ´¾çç±»æå°å®ä»¬çå¼ç¨çé explicit 转æ¢å½æ°ãè¥æ¤å¤å¶åå§åæ¯ cvTçç´æ¥åå§ååºåçä¸é¨åï¼å¯¹äºæ¥åä¸ä¸ªå° cvTçå¼ç¨çæé 彿°ï¼åå§åè¦ç»å®å°å ¶é¦ä¸ªå½¢åçå¼ç¨ï¼ï¼å亦èè explicit 转æ¢å½æ°ã
æ 论åªç§æ¹å¼ï¼å°±éè½½å³è®®èè¨çå®åå表åç±å个å®åç»æï¼å³åå§åå¨è¡¨è¾¾å¼ï¼å®å°ä¼ä¸æé 彿°çé¦ä¸ªå®åæè½¬æ¢å½æ°çéå¼å¯¹è±¡å®åç¸æ¯è¾ã
éè¿è½¬æ¢è¿è¡éç±»åå§å
å½é类类å cv1 T 对象çåå§åè¦æ±æä¸ªç¨æ·å®ä¹è½¬æ¢å½æ°ï¼ä»¥ä»ç±»ç±»å cv S çåå§åå¨è¡¨è¾¾å¼è½¬æ¢æ¶ï¼ä¸å彿°ä¸ºåéï¼
-
Såå ¶åºç±»ï¼é¤ééèï¼ä¸çï¼äº§çTç±»åï¼æå¯ç±æ å转æ¢åºå转æ¢å°Tçç±»åï¼æå°è¿äºç±»åçå¼ç¨çï¼é explicit ç¨æ·å®ä¹è½¬æ¢å½æ°ã对äºéæ©åé彿°èè¨ï¼å¿½ç¥è¿åç±»åä¸ç cv éå®ç¬¦ã - è¥è¿æ¯ç´æ¥åå§åï¼å亦èè
Såå ¶åºç±»ï¼é¤ééèï¼ä¸çï¼äº§çTç±»åï¼æå¯ç±é宿§è½¬æ¢è½¬æ¢å°Tçç±»åï¼æå°è¿äºç±»åçå¼ç¨çï¼explicit ç¨æ·å®ä¹è½¬æ¢å½æ°ã
æ 论åªç§æ¹å¼ï¼å°±éè½½å³è®®èè¨çå®åå表åç±å个å®åç»æï¼å³åå§åå¨è¡¨è¾¾å¼ï¼å®å°ä¼ä¸è½¬æ¢å½æ°çéå«å¯¹è±¡å®åç¸æ¯è¾ã
éè¿è½¬æ¢è¿è¡å¼ç¨åå§å
å¨å°æä»£ cv1 T çå¼ç¨ç»å®å°ä»åå§åå¨è¡¨è¾¾å¼è½¬æ¢å°ç±»ç±»å cv2 S ç左弿å³å¼ç»æçå¼ç¨åå§åæé´ï¼ä¸ºåéééæ©ä¸å彿°ï¼
-
Såå ¶åºç±»ï¼é¤ééèï¼ä¸çï¼å°ä»¥ä¸ç±»åçé explicit ç¨æ·å®ä¹è½¬æ¢å½æ°
- ï¼å½åå§åå·¦å¼å¼ç¨æå°å½æ°çå³å¼å¼ç¨æ¶ï¼å° cv2
T2çå·¦å¼å¼ç¨ - ï¼å½åå§åå³å¼å¼ç¨æå°å½æ°çå·¦å¼å¼ç¨æ¶ï¼cv2
T2æå° cv2T2çå³å¼å¼ç¨
- ï¼å½åå§åå·¦å¼å¼ç¨æå°å½æ°çå³å¼å¼ç¨æ¶ï¼å° cv2
- å ¶ä¸ cv2 T2 ä¸ cv1 T å¼ç¨å ¼å®¹
- 对äºç´æ¥åå§åï¼è¥ T2 ä¸ T 为åä¸ç±»åæè½ä»¥é宿§è½¬æ¢è½¬æ¢å° Tï¼å亦èè explicit ç¨æ·å®ä¹è½¬æ¢å½æ°ã
æ 论åªç§æ¹å¼ï¼å°±éè½½å³è®®èè¨çå®åå表åç±å个å®åç»æï¼å³åå§åå¨è¡¨è¾¾å¼ï¼å®å°ä¼ä¸è½¬æ¢å½æ°çéå«å¯¹è±¡å®åç¸æ¯è¾ã
å表åå§å
å½éèå类类å T ç对象è¿è¡å表åå§åæ¶ï¼è¿è¡ä¸¤é¶æ®µçéè½½å³è®®ã
- å¨é¶æ®µ 1ï¼åé彿°æ¯
Tçææåå§åå¨å表æé 彿°ï¼èå°±éè½½å³è®®èè¨çå®åå表ç±å个åå§åå¨å表å®åç»æ - è¥é¶æ®µ 1 çéè½½å³è®®å¤±è´¥åè¿å
¥é¶æ®µ 2ï¼å
¶ä¸åé彿°æ¯
Tçæææé 彿°ï¼èå°±éè½½å³è®®èè¨çå®åå表ç±åå§åå¨å表çå个åç¬å ç´ æç»æã
è¥åå§åå¨å表为空è T æ¥æé»è®¤æé 彿°ï¼åè·³è¿é¶æ®µ 1ã
å¨å¤å¶å表åå§åä¸ï¼è¥é¶æ®µ 2 éæ© explicit æé 彿°ï¼ååå§åéè¯æï¼ä¸å¤å¶åå§åçæ»ä½ç¸åï¼å®ä»¬çè³ä¸èè explicit æé 彿°ï¼ã
å¯è¡å½æ°
ç»å®ä»¥ä¸è¿°æ¹å¼æé çåé彿°éï¼éè½½å³è®®çä¸ä¸æ¥éª¤æ¯æ£éªå个å®åä¸å½¢åï¼å¹¶å°éå缩å为å¯è¡å½æ°ï¼viable functionï¼çéå
为äºè¢«å å«å¨å¯è¡å½æ°éä¸ï¼åé彿°å¿ 须满足ä¸åæ¡ä»¶ï¼
M 个å®åï¼åå好å
·æ M 个形åçåé彿°å¯è¡ãM 个ï¼è第 M+1 个形ååææåéå½¢åé½å
·æé»è®¤å®åï¼åå®å¯è¡ã对äºå©ä½çéè½½å³è®®ï¼å½¢ååè¡¨è¢«æªæå° Mã|
4) è¥å½æ°æ¥æå
³èçå¶çº¦ï¼åå
¶å¿
é¡»å¾ä»¥æ»¡è¶³ã
|
(C++20 èµ·) |
ç¦æ¢ç¨æ·å®ä¹è½¬æ¢ï¼è½¬æ¢æé 彿°åç¨æ·å®ä¹è½¬æ¢å½æ°ä¸¤è ï¼åä¸å¯è½ä½¿å¾è½åºç¨å¤äºä¸æ¬¡ç¨æ·å®ä¹è½¬æ¢çéå¼è½¬æ¢åºåãç¹å«æ¯ï¼è¥è½¬æ¢ç®æ æ¯æé 彿°çé¦ä¸ªå½¢åï¼æç¨æ·å®ä¹è½¬æ¢å½æ°çéå¼å¯¹è±¡å½¢åï¼è该æé /ç¨æ·å®ä¹è½¬æ¢æ¯ä¸ååå§åçåéï¼åä¸èèç¨æ·å®ä¹è½¬æ¢
- éè¿ç¨æ·å®ä¹è½¬æ¢è¿è¡å¤å¶åå§åï¼
- éè¿è½¬æ¢å½æ°è¿è¡é类类åçåå§åï¼
- ä¸ºç´æ¥å¼ç¨ç»å®çéè¿è½¬æ¢å½æ°è¿è¡çåå§åï¼
- å¨ç±»çå¤å¶åå§åçç¬¬äºæ¥éª¤ï¼ç´æ¥åå§åï¼æé´éè¿æé 彿°æä½çåå§åï¼
- ç±å表åå§åæä½çåå§åï¼å ¶ä¸çåå§åå¨å表åå¥½æ¥æä¸ä¸ªå ç´ ï¼ä¸å ¶èªèº«æ¯ä¸ä¸ªåå§åå¨å表ï¼èç®æ æ¯ç±» X çæé 彿°çé¦ä¸ªå®åï¼èè¯¥è½¬æ¢æ¯å° X æå°ï¼å¯ä¸º cv éå®çï¼X çå¼ç¨ç转æ¢
struct A { A(int); }; struct B { B(A); }; B b{ {0} }; // B çå表åå§å // åéï¼B(const B&)ãB(B&&)ãB(A) // {0} -> B&& ä¸å¯è¡ï¼è¦è°ç¨ B(A) // {0} -> const B& ï¼ä¸å¯è¡ï¼è¦ç»å®å°å³å¼ï¼è¦è°ç¨ B(A) // {0} -> A å¯è¡ãè°ç¨ A(int)ï¼ä¸ç¦æ¢å° A çç¨æ·å®ä¹è½¬æ¢
æä½³å¯è¡å½æ°
å¯¹äºæ¯å¯¹å¯è¡å½æ° F1 å F2ï¼å¯¹ä»ç¬¬ i å®åå°ç¬¬ i å½¢åç转æ¢åæè¡ï¼ä»¥ç¡®å®ä½è
æ´å¥½ï¼é¤äºé¦ä¸ªå®åï¼éææå彿°çéå¼å¯¹è±¡å®å卿è¡ä¸æ²¡æå½±åï¼ã
è¥ F1 çææå®åçéå¼è½¬æ¢ä¸å£äº F2 çææå®åçéå¼è½¬æ¢ï¼ä¸æ»¡è¶³ä¸åæ¡ä»¶ï¼åç¡®å® F1 æ¯ä¼äº F2 ç彿°
|
3) æè¥é妿¤ï¼ï¼ä»
å¨å¯¹å½æ°ç±»åçå¼ç¨è¿è¡ç´æ¥å¼ç¨ç»å®æä½çï¼éè¿è½¬æ¢å½æ°è¿è¡åå§åçè¯å¢ä¸ï¼ï¼F1 çè¿åç±»åæ¯ä¸æ£å¨åå§åçå¼ç¨ç¸åç§ç±»çå¼ç¨ï¼å·¦å¼æå³å¼ï¼ï¼è F2 çè¿åç±»å䏿¯
|
(C++11 èµ·) |
|
6) æè¥é妿¤ï¼F1 ä¸ F2 ä¸ºæ¥æç¸åå½¢åç±»åå表ç鿍¡æ¿å½æ°ï¼ä¸æç
§å¶çº¦çååºè§åï¼F1 æ¯ F2 æ´åå¶çº¦
|
(C++20 èµ·) |
|
7) æè¥é妿¤ï¼F1 æ¯ç±» D çæé 彿°ï¼F2 æ¯ D çåºç±» B çæé 彿°ï¼èå¯¹åºæ¯ä¸ªå®åç F1 å F2 çå½¢ååå
·æç¸åç±»å
|
(C++11 èµ·) |
|
8) æè¥é妿¤ï¼F2 æ¯éåçåéè F1 䏿¯ï¼
9) æè¥é妿¤ï¼F1 å F2 齿¯éååéï¼è F2 æ¯å¸¦éåºå½¢åçåæéååéè F1 䏿¯
|
(C++20 èµ·) |
|
10) æè¥é妿¤ï¼F1 æ¯ä»ç¨æ·å®ä¹æ¨å¯¼æå¼æçæè F2 䏿¯
11) æè¥é妿¤ï¼F1 æ¯å¤å¶æ¨å¯¼åéè F2 䏿¯
12) æè¥é妿¤ï¼F1 æ¯ä»éæ¨¡æ¿æé 彿°çæè F2 æ¯ä»æé 彿°æ¨¡æ¿çæ
template <class T> struct A { using value_type = T; A(value_type); // #1 A(const A&); // #2 A(T, T, int); // #3 template<class U> A(int, T, U); // #4 }; // #5 为 A(A)ï¼ä¸ºå¤å¶æ¨å¯¼åé A x (1, 2, 3); // ä½¿ç¨ #3ï¼ä»éæ¨¡æ¿æé 彿°çæ template <class T> A(T) -> A<T>; // #6ï¼ä¸å¦ #5 ç¹æ® A a (42); // ä½¿ç¨ #6 æ¨åº A<int> å¹¶ç¨ #1 åå§å A b = a; // ä½¿ç¨ #5 æ¨åº A<int> å¹¶ç¨ #2 åå§å template <class T> A(A<T>) -> A<A<T>>; // #7ï¼å #5 䏿 ·ç¹æ® A b2 = a; // ä½¿ç¨ #7 æ¨åº A<A<int>> å¹¶ç¨ #1 åå§å |
(C++17 èµ·) |
对ææå¯è¡å½æ°è¿è¡è¿äºé对æ¯è¾ãè¥æ°æä¸ä¸ªå¯è¡å½æ°ä¼äºææå ¶ä»å½æ°ï¼åéè½½å³è®®æåå¹¶è°ç¨è¯¥å½æ°ãå¦åç¼è¯å¤±è´¥ã
void Fcn(const int*, short); // éè½½ #1 void Fcn(int*, int); // éè½½ #2 int i; short s = 0; void f() { Fcn(&i, 1L); // 第 1 å®åï¼&i -> int* ä¼äº &i -> const int* // 第 2 å®åï¼1L -> short ä¸ 1L -> int çä»· // è°ç¨ Fcn(int*, int)  Fcn(&i,'c'); // 第 1 å®åï¼&i -> int* ä¼äº &i -> const int* // 第 2 å®åï¼'c' -> int ä¼äº 'c' -> short // è°ç¨ Fcn(int*, int)  Fcn(&i, s); // 第 1 å®åï¼&i -> int* ä¼äº &i -> const int* // 第 2 å®åï¼s -> short ä¼äº s -> int // æ èè ï¼ç¼è¯é误 }
éå¼è½¬æ¢åºåçæè¡
éè½½å³è®®æèèçå®å-å½¢åéå¼è½¬æ¢åºåï¼å¯¹åºäºå¤å¶åå§åä¸ï¼å¯¹äºéå¼ç¨å½¢åï¼æç¨çéå¼è½¬æ¢ï¼ä½å¨èèå°éå«å¯¹è±¡å½¢åç转æ¢ï¼æå°èµå¼è¿ç®ç¬¦ç左侧æä½æ°çè½¬æ¢æ¶ï¼ä¸èèå建临æ¶å¯¹è±¡ç转æ¢ã
æ¯ç§æ å转æ¢åºåçç±»åé½è¢«èµäºä¸ä¸ªç级ä¹ä¸ï¼
æ å转æ¢åºåçç级æ¯å ¶æå«çæ å转æ¢ï¼è³å¤å¯æä¸æ¬¡è½¬æ¢ï¼ä¸çæå·®ç级ã
ç´æ¥ç»å®å¼ç¨å½¢åå°å®åè¡¨è¾¾å¼æ¯æçææ´¾çç±»å°åºç±»è½¬æ¢ï¼
struct Base {}; struct Derived : Base {} d; int f(Base&); // éè½½ #1 int f(Derived&); // éè½½ #2 int i = f(d); // d -> Derived& æ¥æåç¡®å¹é ç级 // d -> Base& æ¥æè½¬æ¢ç级 // è°ç¨ f(Derived&)
å 为转æ¢åºåçæè¡ä» æä½ç±»ååå¼ç±»å«ï¼æ å°±æè¡èè¨ï¼ä½åè½ç»å®å°å¼ç¨å½¢åï¼ä½è¥éæ©äºè¿ä¸ªå½æ°ï¼åç¨åºéè¯æã
S1 ä¼äºæ å转æ¢åºå S2ï¼æ¡ä»¶ä¸ºS1 为 S2 çååºåï¼æé¤å·¦å¼åæ¢ãæç转æ¢åºå被认为æ¯ä»»ä½å
¶ä»è½¬æ¢çååºåS1 çç级ä¼äº S2 çç级S1 å S2 é½ç»å®å°æä¸ªå¼ç¨å½¢åï¼èå
¶å¹¶éæä¸ªå¼ç¨éå®çæå彿°çéå¼å¯¹è±¡å½¢åï¼ä¸ S1 ç»å®å³å¼å¼ç¨å°å³å¼è S2 ç»å®å·¦å¼å¼ç¨å°å³å¼
int i; int f1(); int g(const int&); // éè½½ #1 int g(const int&&); // éè½½ #2 int j = g(i); // å·¦å¼ int -> const int& æ¯ä» æçåæ³è½¬æ¢ int k = g(f1()); // å³å¼ int -> const int&& ä¼äº å³å¼ int -> const int&
S1 å S2 é½ç»å®å°å¼ç¨å½¢åï¼ä¸ S1 ç»å®å·¦å¼å¼ç¨å°å½æ°è S2 ç»å®å³å¼å¼ç¨å°å½æ°ã
int f(void(&)()); // éè½½ #1 int f(void(&&)()); // éè½½ #2 void g(); int i1 = f(g); // è°ç¨ #1
S1 å S2 é½ç»å®å°ä»
å¨é¡¶å± cv é宿§æå«çå¼ç¨å½¢åï¼è S1 çç±»åæ¯ S2 ç cv é宿§æ´å°ã
int f(const int &); // éè½½ #1 int f(int &); // éè½½ #2ï¼å为å¼ç¨ï¼ int g(const int &); // éè½½ #1 int g(int); // éè½½ #2 int i; int j = f(i); // å·¦å¼ i -> int& ä¼äº å·¦å¼ int -> const int& // è°ç¨ f(int&) int k = g(i); // å·¦å¼ i -> const int& æè¡ä¸ºåç¡®å¹é // å·¦å¼ i -> å³å¼ int æè¡ä¸ºåç¡®å¹é // ææ§ä¹çéè½½ï¼ç¼è¯é误
S1 çç»æç cv é宿¯ S2 çç»æç cv éå®çåé (C++20 å)è½ç±é宿§è½¬æ¢è½¬æ¢ S1 çç»æä¸º S2 çç»æ (C++20 èµ·)ã
int f(const int*); int f(int*); int i; int j = f(&i); // &i -> int* ä¼äº &i -> const int*ï¼è°ç¨ f(int*)
U1 ä¼äºç¨æ·å®ä¹è½¬æ¢åºå U2ï¼è¥å®ä»¬è°ç¨ç¸åçæé 彿°/ç¨æ·å®ä¹è½¬æ¢å½æ°ï¼æä»¥èååå§ååå§åç¸åçç±»ï¼è任䏿
åµä¸ U1 ä¸çç¬¬äºæ å转æ¢åºåä¼äº U2 ä¸çç¬¬äºæ å转æ¢åºå
struct A { operator short(); // ç¨æ·å®ä¹è½¬æ¢å½æ° } a; int f(int); // éè½½ #1 int f(float); // éè½½ #2 int i = f(a); // A -> shortï¼åé short -> intï¼ç级为æåï¼ // A -> shortï¼åé short -> floatï¼ç级为转æ¢ï¼ // è°ç¨ f(int)
L1 ä¼äºå表åå§ååºå L2ï¼è¥ L1 åå§å std::initializer_list å½¢åè L2 ä¸å¦æ¤ã
void f1(int); // #1 void f1(std::initializer_list<long>); // #2 void g1() { f1({42}); } // éæ© #2 Â void f2(std::pair<const char*, const char*>); // #3 void f2(std::initializer_list<std::string>); // #4 void g2() { f2({"foo","bar"}); } // éæ© #4
|
6) å表åå§ååºå L1 ä¼äºå表åå§ååºå L2 ï¼è¥å¯¹åºå½¢åæ¯å°æ°ç»çå¼ç¨ï¼è L1 转æ¢å°âN1 个 T çæ°ç»âï¼L2 转æ¢å°âN2 个 T çæ°ç»âï¼è N1 å°äº N2ã
|
(C++14 èµ·) (C++20 å) |
|
6) å表åå§ååºå L1 ä¼äºå表åå§ååºå L2 ï¼è L1 ä¸ L2 å转æ¢å°ç¸åå
ç´ ç±»åçæ°ç»ï¼ä¸
void f(int (&&)[] ); // éè½½ #1 void f(double (&&)[] ); // éè½½ #2 void f(int (&&)[2]); // éè½½ #3  f({1}); // #1 ï¼ç±äºè½¬æ¢ä¼äº #2 ï¼ç±äºè¾¹çä¼äº #3 f({1.0}); // #2 ï¼ double -> double ä¼äº double -> int f({1.0, 2.0}); // #2 ï¼ double -> double ä¼äº double -> int f({1, 2}); // #3 ï¼ -> int[2] ä¼äº -> int[] ï¼ // è int -> int ä¼äº int -> double |
(C++20 èµ·) |
è¥ä¸¤ä¸ªè½¬æ¢åºåå ä¸ºæ¥æç¸åç级èä¸å¯è¾¨å«ï¼ååºç¨ä¸åé¢å¤è§åï¼
| (C++11 èµ·) |
Midï¼ç´æ¥æé´æ¥ï¼æ´¾çèª Baseï¼è Derivedï¼ç´æ¥æé´æ¥ï¼æ´¾çèª Midï¼åå¯¹ææ§ä¹ç转æ¢åºåçå级ä¸ç¨æ·å®ä¹è½¬æ¢åºåç¸åï¼å 为ä¸ä¸ªå®åçå¤ä¸ªè½¬æ¢åºåä» è¥å®ä»¬æ¶åä¸åçç¨æ·å®ä¹è½¬æ¢æ¶æè½åå¨ï¼
class B; class A { A (B&);}; // è½¬æ¢æé 彿° class B { operator A (); }; // ç¨æ·å®ä¹è½¬æ¢å½æ° class C { C (B&); }; // è½¬æ¢æé 彿° void f(A) { } // éè½½ #1 void f(C) { } // éè½½ #2 B b; f(b); // B -> A ç»ç±æé 彿°æ B -> A ç»ç±å½æ°ï¼ææ§ä¹è½¬æ¢ï¼ // b -> C ç»ç±æé 彿°ï¼ç¨æ·å®ä¹è½¬æ¢ï¼ // éè½½ #1 å #2 ç转æ¢ä¸å¯è¾¨å«ï¼ç¼è¯å¤±è´¥
å表åå§åä¸çéå¼è½¬æ¢åºå
å¨å表åå§åä¸ï¼å®åæ¯ è±æ¬å·åå§åå¨å表ï¼ä½å®ä¸æ¯è¡¨è¾¾å¼ï¼æ å°å°±éè½½å³è®®èè¨çå½¢åç±»åçéå¼è½¬æ¢åºå以ä¸åè§åå³å®ï¼
|
(C++14 èµ·) |
- è¥å½¢åç±»å为 std::initializer_list<X>ï¼ä¸åå¨ä»æ¯ä¸ªåå§åå¨å表å
ç´ å°
Xçéçªåéå¼è½¬æ¢ï¼åå°±éè½½å³è®®èè¨çéå¼è½¬æ¢åºåæ¯æéçæå转æ¢ãè¥ è±æ¬å·åå§åå¨å表 为空ï¼å转æ¢åºå为æç转æ¢ã
struct A { A(std::initializer_list<double>); // #1 A(std::initializer_list<complex<double>>); // #2 A(std::initializer_list<std::string>); // #3 }; A a{1.0,2.0}; // éæ© #1ï¼å³å¼ double -> doubleï¼æç转æ¢ï¼ void g(A); g({"foo","bar"}); // éæ© #3ï¼å·¦å¼ const char[4] -> std::stringï¼ç¨æ·å®ä¹è½¬æ¢ï¼
- å¦åï¼è¥å½¢åç±»å为âN 个 T çæ°ç»âï¼è¿åªå¯¹å°æ°ç»çå¼ç¨åçï¼ï¼ååå§åå¨å表å¿
é¡»æ N ææ´å°çå
ç´ ï¼è (C++14 èµ·)æç¨çéå¼è½¬æ¢åºåæ¯å°åè¡¨ï¼æç©ºè±æ¬å·å¯¹ï¼è¥ {} å°äº Nï¼ (C++14 èµ·)çæ¯ä¸ªå
ç´ è½¬æ¢å°
Tæéçæåéå¼è½¬æ¢åºåã
|
(C++20 èµ·) |
typedef int IA[3]; void h(const IA&); void g(int (&&)[]) h({1,2,3}); // int -> int æçè½¬æ¢ g({1,2,3}); // C++20 èµ·åä¸
- å¦åï¼è¥å½¢åç±»å为éèå类类å
Xï¼åéè½½å³è®®éå X çæé 彿° C 以ä»å®ååå§åå¨å表åå§å
|
(C++14 èµ·) |
- å¦åï¼ (C++14 èµ·)éå¼è½¬æ¢åºåæ¯ä»¥æç转æ¢ä¸ºç¬¬äºæ å转æ¢åºåçç¨æ·å®ä¹è½¬æ¢åºåã
è¥å¤ä¸ªæé 彿°å¯è¡ï¼ä½æ ä¸ä¼äºå ¶ä»ï¼åéå¼è½¬æ¢åºåæ¯ææ§ä¹ç转æ¢åºåã
struct A { A(std::initializer_list<int>); }; void f(A); struct B { B(int, double); }; void g(B); g({'a','b'}); // è°ç¨ g(B(int,double))ï¼ç¨æ·å®ä¹è½¬æ¢ // g({1.0, 1,0}); // é误ï¼double->int 为çªåï¼å¨å表åå§åä¸ä¸å 许 void f(B); // f({'a','b'}); // f(A) ä¸ f(B) åä¸ºç¨æ·å®ä¹è½¬æ¢
- å¦åï¼è¥å½¢åç±»åä¸ºå¯æç §èååå§åä»åå§åå¨å表åå§åçèåä½ï¼åéå¼è½¬æ¢åºåæ¯ä»¥æç转æ¢ä¸ºç¬¬äºæ å转æ¢åºåçç¨æ·å®ä¹è½¬æ¢åºåã
struct A { int m1; double m2;}; void f(A); f({'a','b'}); // è°ç¨ f(A(int,double))ï¼ç¨æ·å®ä¹è½¬æ¢
- å¦åï¼è¥å½¢å为å¼ç¨ï¼ååºç¨å¼ç¨åå§åè§å
struct A { int m1; double m2; }; void f(const A&); f({'a','b'}); // å建临æ¶éï¼è°ç¨ f(A(int,double))ãç¨æ·å®ä¹è½¬æ¢
- å¦åï¼è¥å½¢åç±»å䏿¯ç±»ï¼ä¸åå§åå¨åè¡¨æ¥æä¸ä¸ªå ç´ ï¼åéå¼è½¬æ¢åºå为å°è¯¥å ç´ è½¬æ¢å°å½¢åç±»åæè¦æ±è ã
- å¦åï¼è¥å½¢åç±»å䏿¯ç±»ï¼ä¸åå§åå¨å表æ å ç´ ï¼åéå¼è½¬æ¢åºå为æç转æ¢ã
|
è¥å®åæ¯ææ´¾åå§åå¨å表ï¼åä» å½å½¢åæ¥æèåç±»åï¼è该类åè½æç §èååå§åçè§åä»åå§åå¨å表åå§åæ¶ï¼è½¬æ¢æå¯è¡ã该æ åµä¸éå¼è½¬æ¢åºåæ¯ä»¥æç转æ¢ä¸ºç¬¬äºæ å转æ¢åºåçç¨æ·å®ä¹è½¬æ¢åºåã è¥å¨éè½½å³è®®åï¼èåä½åæåç声æé¡ºåºä¸æéæ©çéè½½ä¸å¹é ï¼åå½¢åçåå§åå°ä¸ºéè¯æã struct A { int x, y; }; struct B { int y, x; };  void f(A a, int); // #1 void f(B b, ...); // #2 void g(A a); // #3 void g(B b); // #4  void h() { f({.x = 1, .y = 2}, 0); // OKï¼è°ç¨ #1 f({.y = 2, .x = 1}, 0); // é误ï¼éæ© #1ï¼åå§åç±äºä¸å¹é çæå顺åºå¤±è´¥ g({.x = 1, .y = 2}); // é误ï¼å¨ #3 å #4 é´ææ§ä¹ }
|
(C++20 èµ·) |
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 1601 | C++11 | ä» enum 转æ¢å°å ¶åºå±ç±»åä¸å好åºå®çåºå±ç±»å | åºå±ç±»åæ¯æååçè¯¥ç±»åæ´åå好 |
| CWG 1467 | C++14 | ç¥å»äºèåä½åæ°ç»çåç±»åå表åå§å | å®ä¹è¿ç§åå§å |
| CWG 2137 | C++14 | ä» {X} å表åå§å X æ¶ï¼åå§åå¨å表æé 彿°è¾ç»å¤å¶æé 彿° | éèåä½é¦å èèåå§åå¨å表 |
åé
å¼ç¨
- C++17 standard (ISO/IEC 14882:2017):
- 16.3 Overload resolution [over.match]
- C++14 standard (ISO/IEC 14882:2014):
- 13.3 Overload resolution [over.match]
- C++11 standard (ISO/IEC 14882:2011):
- 13.3 Overload resolution [over.match]