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++ è¯è¨ > 彿°å£°æ
彿°å£°æ
彿°å£°æå¼å ¥å½æ°ååå ¶ç±»åã彿°å®ä¹å°å½æ°å/ç±»åä¸å½æ°ä½å ³èã
彿°å£°æ
彿°å£°æå¯åºç°äºä»»ä½ä½ç¨åãå¨ç±»ä½ç¨åä¸ç彿°å£°æå¼å
¥æå彿°ï¼é¤éä½¿ç¨ friend 说æç¬¦ï¼ï¼ç»èè§æå彿°ååå
彿°ã
被声æç彿°ç±»åç±è¿åç±»åï¼return typeï¼ï¼ç±å£°æè¯æ³ç 声æè¯´æç¬¦åºå æä¾ï¼å彿°å£°æç¬¦ï¼å£°æç¬¦ï¼ç»æã
noptr-声æç¬¦ ( å½¢åå表 ) cv(å¯é) ref(å¯é) å¼å¸¸è¯´æ(å¯é) attr(å¯é)
|
(1) | ||||||||
noptr-声æç¬¦ ( å½¢åå表 ) cv(å¯é) ref(å¯é) å¼å¸¸è¯´æ(å¯é) attr(å¯é) -> å°¾éè¿åç±»å
|
(2) | (C++11 èµ·) | |||||||
ï¼å£°æç¬¦ è¯æ³çå ¶ä»å½¢å¼è§å£°æï¼
auto| noptr-声æç¬¦ | - | ä»»ä½åæ³ç 声æç¬¦ï¼ä½è¥å®ä»¥ *ã& æ && å¼å§ï¼åå®å¿ 须为æ¬å·æç¯ç»ã |
| å½¢åå表 | - | å¯ä»¥ä¸ºç©ºï¼å½æ°å½¢åçéå·åéå表ï¼ç»èè§ä¸æï¼ |
| attr(C++11) | - | å¯éç屿§å表ãè¿äºå±æ§åºç¨äºå½æ°ç±»åï¼èé彿°èªèº«ãåºç°äºå£°æç¬¦ä¸æ è¯ç¬¦ä¹åç屿§ä¸åºç°äºå£°æå¼ç«¯ç屿§åå¹¶ï¼è¥å®ä»¬åå¨ã |
| cv | - | const/volatile éå®ï¼åªå 许å¨ééææå彿°ä¸ä½¿ç¨ |
| ref(C++11) | - | å¼ç¨éå®ï¼åªå 许å¨ééææå彿°ä¸ä½¿ç¨ |
| å¼å¸¸è¯´æ | - | 卿å¼å¸¸è¯´æ(C++17 å)æ
noexcept 说æ(C++11)ä¹ä¸ã注æï¼å¼å¸¸è¯´æä¸æ¯å½æ°ç±»åçä¸é¨å (C++17 å) |
| å°¾éè¿åç±»å(C++11) | - | å°¾éè¿åç±»åï¼å½è¿åç±»ååå³äºå®ååæ¶ï¼ä¾å¦ template <class T, class U> auto add(T t, U u) -> decltype(t + u);ï¼æå½è¿åç±»å夿æ¶ï¼ä¾å¦å¨ auto fpif(int)->int(*)(int) ä¸ï¼å°¾éè¿åç±»åå¾æç¨ |
|
å¦å¨å£°æä¸ææåçï¼å£°æç¬¦å¯ä»¥åé requires åå¥ï¼å®å£°æè¯¥å½æ°æå ³èçå¶çº¦ï¼èéè½½å³è®®æè¦éæ©ç彿°å¿ 须满足该å¶çº¦ãï¼ä¾å¦ void f1(int a) requires true;ï¼æ³¨æï¼å ³èçå¶çº¦æ¯å½æ°ç¾åçä¸é¨åï¼ä½ä¸æ¯å½æ°ç±»åçä¸é¨åã |
(C++20 èµ·) |
åªè¦ 声æè¯´æç¬¦åºå å 许ï¼å½æ°å£°æç¬¦å°±å¯ä¸å ¶ä»å£°æç¬¦æ··åï¼
// 声æä¸ä¸ª intãä¸ä¸ª int*ãä¸ä¸ªå½æ°ï¼åä¸ä¸ªå½æ°æé int a = 1, *p = NULL, f(), (*pf)(double); // 声æè¯´æç¬¦åºå æ¯ int // 声æç¬¦ f() 声æï¼ä½ä¸å®ä¹ï¼ // ä¸ä¸ªä¸æ¥åå®åå¹¶è¿å int ç彿°  struct S { virtual int f(char) const, g(int) &&; // 声æä¸¤ä¸ªééææå彿° virtual int f(char), x; // ç¼è¯æ¶é误ï¼virtualï¼å¨ 声æè¯´æç¬¦åºå ä¸ï¼ // ä» å¨ééææå彿°ç声æä¸å 许 };
|
以 volatile éå®ç对象类å为形åç±»åæè¿åç±»åæ¯è¢«å¼ç¨çã |
(C++20 èµ·) |
彿°çè¿åç±»åä¸è½æ¯å½æ°ç±»åææ°ç»ç±»åï¼ä½å¯ä»¥æ¯å°å®ä»¬çæéæå¼ç¨ï¼ã
|
ä¸ä»»ä½å£°æç¸åï¼åºç°äºå£°æä¹åç屿§å声æç¬¦ä¸ç´æ¥è·å¨æ è¯ç¬¦ä¹åç屿§ï¼é½åºç¨äºæå£°ææå®ä¹çå®ä½ï¼å¨æ¤ä¾ä¸ï¼åºç¨å°å½æ°ï¼ [[noreturn]] void f [[noreturn]] (); // OKï¼ä¸¤ä¸ªå±æ§é½åºç¨å°å½æ° f ç¶èï¼ï¼è¯æ³ä¸ï¼åºç°äºå£°æç¬¦ä¹åç屿§ï¼åºç¨å°å½æ°ç±»åï¼èé彿°èªèº« void f() [[noreturn]]; // éè¯¯ï¼æ¤å±æ§å¯¹æææ ä½ç¨ |
(C++11 èµ·) |
ä¸ä»»ä½å£°æç¸åï¼ret func(params) æå£°æç彿° func çç±»å为 ret(params)ï¼ä½éç¨ä¸ææè¿°çå½¢åç±»åéç¼ï¼ï¼åè§ ç±»åçå½åã
è¿åç±»åæ¨å¯¼è¥å½æ°å£°æç 声æè¯´æç¬¦åºå å
å«å
³é®è¯ int x = 1; auto f() { return x; } // è¿åç±»åæ¯ int const auto& f() { return x; } // è¿åç±»åæ¯ const int& è¥è¿åç±»åæ¯ int x = 1; decltype(auto) f() { return x; } // è¿åç±»åæ¯ intï¼å decltype(x) decltype(auto) f() { return(x); } // è¿åç±»åæ¯ int&ï¼å decltype((x)) ï¼æ³¨æï¼â è¥æå¤æ¡è¿åè¯å¥ï¼åå®ä»¬å¿ é¡»æ¨å¯¼åºç¸åç±»å auto f(bool val) { if(val) return 123; // æ¨å¯¼è¿åç±»å int else return 3.14f; // éè¯¯ï¼æ¨å¯¼è¿åç±»å float } è¥æ return è¯å¥æè¥ return è¯å¥çå®åæ¯ void 表达å¼ï¼åæå£°æçè¿åç±»åï¼å¿ é¡»è¦ä¹æ¯ decltype(auto)ï¼æ¤æ åµä¸æ¨å¯¼è¿åç±»åæ¯ voidï¼è¦ä¹æ¯ï¼å¯æ cv éå®çï¼autoï¼æ¤æ åµä¸æ¨å¯¼çè¿åç±»å忝ï¼åä¸ cv éå®çï¼voidã auto f() {} // è¿å void auto g() { return f(); } // è¿å void auto* x() {} // é误: ä¸è½ä» void æ¨å¯¼ auto* 䏿¦å¨å½æ°ä¸è§å°ä¸æ¡ return è¯å¥ï¼åä»è¯¥è¯å¥æ¨å¯¼çè¿åç±»åå°±å¯ç¨äºå½æ°çå©ä½é¨åï¼å æ¬å ¶ä» return è¯å¥ã auto sum(int i) { if(i == 1) return i; // sum çè¿åç±»åæ¯ int else return sum(i - 1) + i; // OKï¼sum çè¿åç±»åå·²ç¥ } è¥ return è¯å¥ä½¿ç¨è±æ¬å·åå§åå¨å表ï¼brace-init-listï¼ï¼åä¸å 许æ¨å¯¼ï¼ auto func () { return {1, 2, 3}; } // é误 è彿°ä¸è½ä½¿ç¨è¿åç±»åæ¨å¯¼ã struct F { virtual auto f() { return 2; } // é误 }; è¥å½æ°ä½¿ç¨è¿åç±»åæ¨å¯¼ï¼åå®ä¸è½ç¨å ¶æ¨å¯¼çç±»åæå ¶ä»ç§ç±»çè¿åç±»åæ¨å¯¼å声æï¼å³ä½¿æ¨å¯¼åºç¸åç±»å乿¯å¦æ¤ auto f(); // 已声æï¼æªå®ä¹ auto f() { return 42; } // å·²å®ä¹ï¼è¿åç±»åæ¯ int int f(); // é误ï¼ä¸è½ä½¿ç¨æ¨å¯¼çç±»å decltype(auto) f(); // é误ï¼ä¸åç§ç±»çæ¨å¯¼ auto f(); // OKï¼å声æ  template<typename T> struct A { friend T frf(T); }; auto frf(int i) { return i; } // 䏿¯ A<int> çåå é¤äºç¨æ·å®ä¹è½¬æ¢å½æ°ä»¥å¤ç彿°æ¨¡æ¿å¯ä»¥ä½¿ç¨è¿åç±»åæ¨å¯¼ãå³ä½¿ return è¯å¥ä¸ç表达å¼å¹¶éå¾ å³çï¼æ¨å¯¼ä¹å¨å®ä¾åæ¶åçãè¿ç§å®ä¾åå¹¶ä¸å¤äº SFINAE çç®ççç«å³è¯å¢ä¸ã template<class T> auto f(T t) { return t; } typedef decltype(f(1)) fint_t; // å®ä¾å f<int> 以æ¨å¯¼è¿åç±»å template<class T> auto f(T* t) { return *t; } void g() { int (*p)(int*) = &f; } // å®ä¾å两个 f 以确å®è¿åç±»åï¼ // éæ©ç¬¬äºä¸ªæ¨¡æ¿éè½½ 使ç¨è¿åç±»åæ¨å¯¼ç彿°æ¨¡æ¿ç¹åå¿ é¡»ä½¿ç¨åä¸è¿åç±»åå ä½ç¬¦ template<typename T> auto g(T t) { return t; } // #1 template auto g(int); // OKï¼è¿åç±»åæ¯ int //template char g(char); // éè¯¯ï¼æ å¹é çæ¨¡æ¿  template<> auto g(double); // OKï¼ç¨æªç¥è¿åç±»åçå置声æ template<typename T> T g(T t) { return t; } // OKï¼ä¸çä»·äº #1 template char g(char); // OKï¼ç°å¨æå¹é çæ¨¡æ¿ template auto g(float); // ä»ç¶å¹é #1 // void h() { return g(42); } // éè¯¯ï¼æ§ä¹ æ¾å¼å®ä¾å声æèªèº«å¹¶ä¸å®ä¾å使ç¨è¿åç±»åæ¨å¯¼ç彿°æ¨¡æ¿ template<typename T> auto f(T t) { return t; } extern template auto f(int); // ä¸å®ä¾å f<int> int (*p)(int) = f; // å®ä¾å f<int> 以确å®å ¶è¿åç±»åï¼ // ä½ä»éè¦å¨ç¨åºçå«å¤åºç°æ¾å¼å®ä¾åçå®ä¹ |
(C++14 èµ·) |
å½¢åå表
å½¢åå表å³å®è°ç¨å½æ°æ¶æè½æå®çå®åã宿¯å½¢å声æçéå·åéå表ï¼å ¶ä¸æ¯ä¸é¡¹æ¥æä¸åè¯æ³
| attr(å¯é) 声æè¯´æç¬¦åºå 声æç¬¦ | (1) | ||||||||
attr(å¯é) 声æè¯´æç¬¦åºå 声æç¬¦ = åå§åå¨
|
(2) | ||||||||
| attr(å¯é) 声æè¯´æç¬¦åºå æ½è±¡å£°æç¬¦(å¯é) | (3) | ||||||||
attr(å¯é) 声æè¯´æç¬¦åºå æ½è±¡å£°æç¬¦(å¯é) = åå§åå¨
|
(4) | ||||||||
void
|
(5) | ||||||||
int f(int a, int *p, int (*(*x)(double))[3]);
int f(int a = 7, int *p = nullptr, int (*(*x)(double))[3] = nullptr);
int f(int, int *, int (*(*)(double))[3]);
int f(int = 7, int * = nullptr, int (*(*)(double))[3] = nullptr);
voidï¼å¯ä»¥æ cv éå®ï¼ä¸è½å¨å
¶ä»æ
åµä¸ç¨äºåæ°å表ï¼int f(void, int); å int f(const void); æ¯é误çï¼ä½å¯ä»¥ä½¿ç¨å
¶è¡çç±»åï¼å¦ void*ï¼ã卿¨¡æ¿ä¸ï¼åªè½ä½¿ç¨éå¾
å³ç voidï¼å½ä»¥ T = void å®ä¾åæ¶ï¼éç¨å个 T ç±»åçå½¢åç彿°ä¸ä¼æä¸ºæ å½¢å彿°ï¼ (C++11 èµ·)çç¥å· ... å¯åºç°äºå½¢åå表æ«å°¾ï¼è¿å£°æä¸ä¸ªåå彿°ï¼variadic functionï¼ï¼
int printf(const char* fmt ...);
为äºä¸ C89 å ¼å®¹ï¼å½å½¢ååè¡¨å«æè³å°ä¸ä¸ªå½¢åæ¶ï¼çç¥å·åå¯åºç°å¯éçéå·ï¼
int printf(const char* fmt, ...); // OKï¼åä¸
|
尽管 声æè¯´æç¬¦åºå è´å«äºå¯ä»¥åå¨ç±»å说æç¬¦ä¹å¤ç说æç¬¦ï¼ä½å ¶ä»åå 许ç说æç¬¦ä» æ register å auto (C++11 å)ï¼ä¸å®æ 任使æã |
(C++17 å) |
|
è¥ä»»ä½å½æ°å½¢å使ç¨äºå ä½ç¬¦ï¼placeholderï¼ï¼ void f1(auto); // å template<class T> void f(T) void f2(C1 auto); // å template<C1 T> void f7(T)ï¼è¥ C1 æ¯æ¦å¿µ |
(C++20 èµ·) |
声æäºå½æ°å£°æä¹ä¸çå½¢ååé常åªç¨ä½ä»¥èªèº«ä¸ºææ¡£çç®çãå®ä»¬å¨å½æ°å®ä¹ä¸è¢«ä½¿ç¨ï¼ä½ä»æ¯å¯éçï¼ã
å½¢åå表ä¸çæ¯ä¸ªå½æ°å½¢åçç±»åï¼æ ¹æ®ä¸åè§åç¡®å®ï¼
å 为è¿äºè§åï¼ä¸å彿°å£°æç¡®åå°å£°æåä¸å½æ°ï¼
int f(char s[3]); int f(char[]); int f(char* s); int f(char* const); int f(char* volatile s);
ä¸å声æä¹ç¡®åå°å£°æåä¸å½æ°ï¼
int f(int()); int f(int (*g)());
|
å½¢åç±»åä¸è½æ¯å«æå°æªç¥è¾¹çæ°ç»çå¼ç¨ææéçç±»åï¼å«æè¿ç§ç±»åçå¤çº§æé/æ°ç»ï¼æå«ææå以è¿äºç±»å为形åç彿°æé |
(C++14 å) |
|
æç¤ºå¯åå®åççç¥å·åä¸è½æéå·ï¼å³ä½¿å®è·éæç¤ºå½¢åå å±å¼ççç¥å·ä¹æ¯å¦æ¤ï¼æ ä¸å彿°æ¨¡æ¿æ¯ç¡®åç¸åçï¼ template<typename ...Args> void f(Args..., ...); template<typename ...Args> void f(Args... ...); template<typename ...Args> void f(Args......); 使ç¨è¿ç§å£°æçä¾åä¹ä¸æ¯ std::is_function çå®ç°ã |
(C++11 èµ·) |
彿°å®ä¹
éæå彿°çå®ä¹åªè½åºç°å¨å½å空é´ä½ç¨åä¸ï¼ä¸åå¨åµå¥å½æ°ï¼ãæå彿°çå®ä¹äº¦å¯åºç°å¨ç±»å®ä¹çä½å ãå®ä»¬æ¥æä¸åè¯æ³ï¼
| attr(å¯é) 声æè¯´æç¬¦åºå(å¯é) 声æç¬¦ è声æç¬¦åºå(å¯é) 彿°ä½ | |||||||||
å ¶ä¸ å½æ°ä½ æ¯ä¸åä¹ä¸
| æé 彿°åå§åå¨(å¯é) å¤åè¯å¥ | (1) | ||||||||
| 彿°-try-å | (2) | ||||||||
= delete ;
|
(3) | (C++11 èµ·) | |||||||
= default ;
|
(4) | (C++11 èµ·) | |||||||
| attr(C++11) | - | å¯éç屿§å表ãè¿äºå±æ§ä¸åºç°å¨ 声æç¬¦ 䏿 è¯ç¬¦ä¹åç屿§ç»åï¼è§æ¬é¡µé¡¶é¨ï¼ï¼è¥å®ä»¬åå¨ã |
| 声æè¯´æç¬¦åºå | - | 带æè¯´æç¬¦çè¿åç±»åï¼ä¸å£°æææ³ç¸å |
| 声æç¬¦ | - | 彿°å£°æç¬¦ï¼ä¸ä¸è¿°å½æ°å£°æææ³ç¸åãå彿°å£°æä¸æ ·ï¼å®å¯åé requires-åå¥ (C++20 èµ·) |
| è说æç¬¦åºå(C++11) | - | overrideãfinalï¼æå®ä»¬ä»»æé¡ºåºçç»åï¼ä» 对æå彿°å è®¸ï¼ |
| æé 彿°åå§åå¨ | - | æååå§åå¨å表ï¼ä» 卿é 彿°ä¸å 许 |
| å¤åè¯å¥ | - | è±æ¬å·ç¯ç»çè¯å¥åºåï¼å®ä»¬ææå½æ°ä½ |
int max(int a, int b, int c) { int m = (a > b)? a : b; return (m > c)? m : c; } // 声æè¯´æç¬¦åºå æ¯âintâ // 声æç¬¦æ¯âmax(int a, int b, int c)â // 彿°ä½æ¯ { ... }
彿°ä½æ¯ä¸æ¡å¤åè¯å¥ï¼ä¸ºä¸å¯¹è±æ¬å·æç¯ç»ç鶿夿¡è¯å¥ï¼ï¼å®ä»¬å¨å½æ°è°ç¨æ¶è¢«æ§è¡ã
彿°çå个形åç±»ååè¿åç±»åä¸è½æ¯ä¸å®æ´ç类类åï¼é¤äºè¢«å¼ç½®ç彿° (C++11 èµ·)ã宿´æ§æ£æ¥å¨å½æ°ä½çè¯å¢ä¸è¿è¡ï¼è¿å 许æå彿°è¿åå¨å ¶ä¸å®ä¹å®ä»¬çç±»ï¼æå ¶å¤å´ç±»ï¼ï¼å°½ç®¡å¨å®ä¹ç¹å®æ¯ä¸å®æ´çï¼å®å¨å½æ°ä½å 宿´ï¼ã
å¨å½æ°å®ä¹ç 声æç¬¦ ä¸å£°æçå½¢åï¼å¨å½æ°ä½å å¤äºä½ç¨åä¸ãè¥æä¸ªå½¢åæªå¨å½æ°ä½ä¸ä½¿ç¨ï¼åå®ä¸éè¦å ·åï¼ä½¿ç¨æ½è±¡å£°æç¬¦è¶³ç£ï¼
void print(int a, int) // æªä½¿ç¨ç¬¬äºä¸ªå½¢å { std::printf("a = %d\n",a); }
尽管形åä¸çé¡¶å± cv éå®ç¬¦å¨å½æ°å£°æä¸è¢«å¿½ç¥ï¼å®ä»¬äº¦ä¼ä¿®é¥°å½¢åçç±»åï¼è¿å¨å½æ°ä½ä¸å¯è§ï¼
void f(const int n) // 声æ void(int) ç±»åç彿° { // ä½å¨ä½å ï¼n çç±»åæ¯ const int }
å¼ç½®å½æ°å¦æå代彿°ä½è使ç¨ç¹æ®è¯æ³ è¥å½æ°è¢«éè½½ï¼åé¦å è¿è¡éè½½å³è®®ï¼ä¸ä» å½éæ©äºå¼ç½®å½æ°æ¶ç¨åºæéè¯æã struct sometype { void* operator new(std::size_t) = delete; void* operator new[](std::size_t) = delete; }; sometype* p = new sometype; // é误ï¼å°è¯è°ç¨å¼ç½®ç sometype::operator new 彿°çå¼ç½®å®ä¹å¿ é¡»æ¯ç¿»è¯åå ä¸ç馿¡å£°æï¼å·²ç»å£°æè¿ç彿°ä¸è½å£°æä¸ºå¼ç½®çï¼ struct sometype { sometype(); }; sometype::sometype() = delete; // é误ï¼å¿ é¡»å¨é¦æ¡å£°æå¼ç½® __func__å¨å½æ°ä½å ï¼å¦å以å¦ä¸æ¹å¼å®ä¹äºå½æ°å±é¨çé¢å®ä¹åé __func__ static const char __func__[] = "function-name"; æ¤åéå ·æåä½ç¨ååéæåå¨æï¼ struct S { S(): s(__func__) {} // OKï¼åå§åå¨å表æ¯å½æ°ä½çä¸é¨å const char* s; }; void f(const char* s = __func__); // é误ï¼å½¢åå表æ¯å£°æç¬¦çä¸é¨å |
(C++11 èµ·) |
注解
å¨ä½¿ç¨ç´æ¥åå§åè¯æ³çåé声æå彿°å£°æä¹é´ææ§ä¹çæ åµä¸ï¼ç¼è¯å¨éæ©å½æ°å£°æï¼è§ç´æ¥åå§å
示ä¾
| æ¬èæªå®æ åå ï¼ç§»å¨/æ¸ ç |
#include <iostream> #include <string>  // å½å空é´ï¼æä»¶ï¼ä½ç¨åä¸ç声æ // ï¼å®ä¹å¨å颿ä¾ï¼ int f1();  // æ¥æé»è®¤å®åçç®å彿°ï¼ä¸è¿åå 容 void f0(const std::string& arg = "world") { std::cout << "Hello, " << arg << '\n'; }  // è¿åæå f0 çæéç彿° auto fp11() -> void(*)(const std::string&) { return f0; }  // è¿åæå f0 çæéç彿°ï¼C++11 åç飿 ¼ void (*fp03())(const std::string&) { return f0; }  int main() { f0(); fp11()("test"); fp03()("again"); int f2(std::string); // åä½ç¨åä¸ç声æ std::cout << f2("bad12") << '\n'; }  // ç®åçéæå彿°ï¼è¿å int int f1() { return 42; }  // æ¥æå¼å¸¸è¯´æå彿° try åç彿° int f2(std::string str) noexcept try { return std::stoi(str); } catch(const std::exception& e) { std::cerr << "stoi() failed!\n"; return 0; }
è¾åºï¼
Hello, world Hello, test Hello, again stoi() failed! 0
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 1394 | C++11 | å¼ç½®å½æ°ä¸è½è¿åä¸å®æ´ç±»å | å 许ä¸å®æ´çè¿åç±»å |
| CWG 577 | C++11 | å¾ å³ç±»å void å¯ç¨äºå£°ææ å½¢å彿° | ä» å 许éå¾ å³ç void |
| CWG 393 | C++14 | 嫿尿ªç¥è¾¹çæ°ç»çæé/å¼ç¨çç±»åä¸è½ä½ä¸ºå½¢å | å 许è¿äºç±»å |