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++ è¯è¨ > å¼ç±»å«
å¼ç±»å«
æ¯ä¸ª C++ 表达å¼ï¼å¸¦ææä½æ°çæä½ç¬¦ãåé¢éãåéåçï¼å¯æç §ä¸¤ç§ç¬ç«çç¹æ§å 以辨å«ï¼ç±»ååå¼ç±»å« (value category)ãæ¯ä¸ªè¡¨è¾¾å¼é½å ·ææç§éå¼ç¨ç±»åï¼ä¸æ¯ä¸ªè¡¨è¾¾å¼åªå±äºä¸ç§åºæ¬å¼ç±»å«ä¸çä¸ç§ï¼çº¯å³å¼ (prvalue)ãäº¡å¼ (xvalue)ãå·¦å¼ (lvalue)ã
|
(C++17 èµ·) |
注æï¼è¿ä¸ªåç±»æ³ä¸ C++ æ åè¿å»çåçæ¬ç¸æ¯ï¼ç»åäºæ¾èåæ´ï¼ç»èè§ä¸æçåå²é¨åã
åºæ¬ç±»å«
å·¦å¼
ä¸åè¡¨è¾¾å¼æ¯å·¦å¼è¡¨è¾¾å¼ï¼
- åéã彿°ã模æ¿å½¢å对象 (C++20 èµ·)ææ°æ®æåä¹åï¼ä¸è®ºå ¶ç±»åï¼ä¾å¦ std::cin æ std::endlãå³ä½¿åéçç±»åæ¯å³å¼å¼ç¨ï¼ç±å ¶ååææç表达å¼ä»æ¯å·¦å¼è¡¨è¾¾å¼ï¼
- è¿åç±»å为左å¼å¼ç¨ç彿°è°ç¨æéè½½è¿ç®ç¬¦è¡¨è¾¾å¼ï¼ä¾å¦ std::getline(std::cin, str)ãstd::cout << 1ãstr1 = str2 æ ++itï¼
- a = bï¼a += bï¼a %= bï¼ä»¥åææå ¶ä»å 建çèµå¼åå¤åèµå¼è¡¨è¾¾å¼ï¼
- ++a å --aï¼å 建çåç½®èªå¢ä¸åç½®èªå表达å¼ï¼
- *pï¼å 建çé´æ¥å¯»å表达å¼ï¼
- a[n] å n[a]ï¼å
建ç䏿 表达å¼ï¼ä½
a[n]ä¸çä¸ä¸ªæä½æ°åºä¸ºæ°ç»å·¦å¼ (C++11 èµ·)ï¼ - a.mï¼å¯¹è±¡æå表达å¼ï¼é¤äº
m为æåæä¸¾é¡¹æééææå彿°ï¼æèa为å³å¼èm为éå¼ç¨ç±»åçééææ°æ®æåçæ åµï¼ - p->mï¼å
建çæéæå表达å¼ï¼é¤äº
m为æåæä¸¾é¡¹æééææå彿°çæ åµï¼ - a.*mpï¼å¯¹è±¡çæåæé表达å¼ï¼å
¶ä¸
aæ¯å·¦å¼ä¸mpæ¯æ°æ®æåæéï¼ - p->*mpï¼å
建çæéçæåæé表达å¼ï¼å
¶ä¸
mpæ¯æ°æ®æåæéï¼ - a, bï¼å
建çéå·è¡¨è¾¾å¼ï¼å
¶ä¸
bæ¯å·¦å¼ï¼ - a ? b : cï¼å¯¹æäº
båcçä¸å æ¡ä»¶è¡¨è¾¾å¼ï¼ä¾å¦ï¼å½å®ä»¬é½æ¯åç±»å左弿¶ï¼ä½ç»èè§å ¶å®ä¹ï¼ï¼ - å符串åé¢éï¼ä¾å¦ "Hello, world!"ï¼
- 转æ¢ä¸ºå·¦å¼å¼ç¨ç±»åç转å表达å¼ï¼ä¾å¦ static_cast<int&>(x)ï¼
|
(C++11 èµ·) |
æ§è´¨ï¼
- 䏿³å·¦å¼ç¸åï¼è§ä¸æï¼ã
- å¯ä»¥åå·¦å¼çå°åï¼&++i[1] å &std::endl æ¯åæ³è¡¨è¾¾å¼ã
- å¯ä¿®æ¹çå·¦å¼å¯ç¨ä½å 建èµå¼åå 建å¤åèµå¼è¿ç®ç¬¦çå·¦æä½æ°ã
- å·¦å¼å¯ç¨äºåå§åå·¦å¼å¼ç¨ï¼è¿ä¼å°ä¸ä¸ªæ°ååå ³èç»è¯¥è¡¨è¾¾å¼ææ è¯ç对象ã
纯å³å¼
ä¸åè¡¨è¾¾å¼æ¯çº¯å³å¼è¡¨è¾¾å¼ï¼
- ï¼é¤äºå符串åé¢éä¹å¤çï¼åé¢éï¼ä¾å¦ 42ãtrue æ nullptrï¼
- è¿åç±»åæ¯éå¼ç¨ç彿°è°ç¨æéè½½è¿ç®ç¬¦è¡¨è¾¾å¼ï¼ä¾å¦ str.substr(1, 2)ãstr1 + str2 æ it++ï¼
- a++ å a--ï¼å 建çåç½®èªå¢ä¸åç½®èªå表达å¼ï¼
- a + bãa % bãa & bãa << bï¼ä»¥åå ¶ä»ææå 建çç®æ¯è¡¨è¾¾å¼ï¼
- a && bãa || bã!aï¼å 建çé»è¾è¡¨è¾¾å¼ï¼
- a < bãa == bãa >= b 以åå ¶ä»ææå å»ºçæ¯è¾è¡¨è¾¾å¼ï¼
- &aï¼å 建çåå°å表达å¼ï¼
- a.mï¼å¯¹è±¡æå表达å¼ï¼å
¶ä¸
mæ¯æåæä¸¾é¡¹æééææå彿°[2]ï¼æå ¶ä¸a为å³å¼ä¸m为éå¼ç¨ç±»åçééææ°æ®æå (C++11 å)ï¼ - p->mï¼å
建çæéæå表达å¼ï¼å
¶ä¸
m为æåæä¸¾é¡¹æééææå彿°[2]ï¼ - a.*mpï¼å¯¹è±¡çæåæé表达å¼ï¼å
¶ä¸
mpæ¯æå彿°æé[2]ï¼æå ¶ä¸a为å³å¼ä¸mpä¸ºæ°æ®æåæé (C++11 å)ï¼ - p->*mpï¼å
建çæéçæåæé表达å¼ï¼å
¶ä¸
mpæ¯æå彿°æé[2]ï¼ - a, bï¼å
建çéå·è¡¨è¾¾å¼ï¼å
¶ä¸
bæ¯å³å¼ï¼ - a ? b : cï¼å¯¹æäº
båcçä¸å æ¡ä»¶è¡¨è¾¾å¼ï¼ç»èè§å ¶å®ä¹ï¼ï¼ - 转æ¢ä¸ºéå¼ç¨ç±»åç转å表达å¼ï¼ä¾å¦ static_cast<double>(x)ãstd::string{} æ (int)42ï¼
- this æéï¼
- æä¸¾é¡¹;
- éç±»åæ¨¡æ¿å½¢åï¼é¤éå ¶ç±»å为类æ (C++20 èµ·)å·¦å¼å¼ç¨ç±»åï¼
|
(C++11 èµ·) |
|
(C++20 èµ·) |
æ§è´¨ï¼
- ä¸å³å¼ç¸åï¼è§ä¸æï¼ã
- 纯å³å¼ä¸è½å¤æï¼å®ææ è¯ç对象çå¨æç±»åå§ç»ä¸ºè¯¥è¡¨è¾¾å¼çç±»åã
- éç±»éæ°ç»ç纯å³å¼ä¸è½æ cv éå®ãï¼æ³¨æï¼å½æ°è°ç¨æè½¬å表达å¼å¯è½çæéç±»ç cv éå®ç±»åç纯å³å¼ï¼ä½å ¶ cv éå®ç¬¦è¢«ç«å³å¥é¤ãï¼
- 纯å³å¼ä¸è½å
·æä¸å®æ´ç±»åï¼é¤äºç±»å
voidï¼è§ä¸æï¼ï¼æå¨ decltype 说æç¬¦ä¸ä½¿ç¨ä¹å¤ï¼ - 纯å³å¼ä¸è½å ·ææ½è±¡ç±»ç±»åæå ¶æ°ç»ç±»åã
亡å¼
ä¸åè¡¨è¾¾å¼æ¯äº¡å¼è¡¨è¾¾å¼ï¼
- è¿åç±»å为对象çå³å¼å¼ç¨ç彿°è°ç¨æéè½½è¿ç®ç¬¦è¡¨è¾¾å¼ï¼ä¾å¦ std::move(x)ï¼
- a[n]ï¼å 建ç䏿 表达å¼ï¼å ¶æä½æ°ä¹ä¸æ¯æ°ç»å³å¼ï¼
- a.mï¼å¯¹è±¡æå表达å¼ï¼å
¶ä¸
aæ¯å³å¼ä¸mæ¯éå¼ç¨ç±»åçééææ°æ®æåï¼ - a.*mpï¼å¯¹è±¡çæåæé表达å¼ï¼å
¶ä¸
a为å³å¼ä¸mpä¸ºæ°æ®æåæéï¼ - a ? b : cï¼å¯¹æäº
båcçä¸å æ¡ä»¶è¡¨è¾¾å¼ï¼ç»èè§å ¶å®ä¹ï¼ï¼ - 转æ¢ä¸ºå¯¹è±¡çå³å¼å¼ç¨ç±»åç转å表达å¼ï¼ä¾å¦ static_cast<char&&>(x)ï¼
|
(C++17 èµ·) |
æ§è´¨ï¼
- ä¸å³å¼ç¸åï¼è§ä¸æï¼ã
- 䏿³å·¦å¼ç¸åï¼è§ä¸æï¼ã
ç¹å«æ¯ï¼ä¸ææçå³å¼ç±»ä¼¼ï¼äº¡å¼å¯ä»¥ç»å®å°å³å¼å¼ç¨ä¸ï¼èä¸ä¸ææçæ³å·¦å¼ç±»ä¼¼ï¼äº¡å¼å¯ä»¥æ¯å¤æçï¼èä¸éç±»ç亡å¼å¯ä»¥æ cv éå®ã
æ··åç±»å«
æ³å·¦å¼
æ³å·¦å¼è¡¨è¾¾å¼å æ¬å·¦å¼ã亡å¼ã
æ§è´¨ï¼
- æ³å·¦å¼å¯ä»¥éè¿å·¦å¼å°å³å¼ãæ°ç»å°æéæå½æ°å°æééå¼è½¬æ¢è½¬æ¢æçº¯å³å¼ã
- æ³å·¦å¼å¯ä»¥æ¯å¤æçï¼å ¶ææ è¯ç对象çå¨æç±»åä¸å¿ æ¯è¯¥è¡¨è¾¾å¼çéæç±»åã
- æ³å·¦å¼å¯ä»¥å ·æä¸å®æ´ç±»åï¼åªè¦è¡¨è¾¾å¼ä¸å®¹è®¸ã
å³å¼
å³å¼è¡¨è¾¾å¼å æ¬çº¯å³å¼ã亡å¼ã
æ§è´¨ï¼
- å³å¼ä¸è½è¢«åå°åï¼&int()ã&i++[3]ã&42 å &std::move(x) æ¯éæ³çã
- å³å¼ä¸è½ç¨ä½å 建èµå¼è¿ç®ç¬¦åå 建å¤åèµå¼è¿ç®ç¬¦çå·¦æä½æ°ã
- å³å¼å¯ä»¥ç¨äºåå§å const å·¦å¼å¼ç¨ï¼è¿ç§æ åµä¸è¯¥å³å¼ææ è¯ç对象ççåæè¢«å»¶é¿å°è¯¥å¼ç¨çä½ç¨åç»å°¾ã
|
(C++11 èµ·) |
ç¹æ®ç±»å«
æªå³æå彿°è°ç¨
è¡¨è¾¾å¼ a.mf ä¸ p->mfï¼å
¶ä¸ mf æ¯ééææå彿°ï¼ä»¥åè¡¨è¾¾å¼ a.*pmf ä¸ p->*pmfï¼å
¶ä¸ pmf æ¯æå彿°æéï¼è¢«å½ç±»ä¸ºçº¯å³å¼è¡¨è¾¾å¼ï¼ä½å®ä»¬ä¸è½ç¨æ¥åå§åå¼ç¨ï¼ä½ä¸ºå½æ°å®åï¼æè
ç¨äºé¤äºä½ä¸ºå½æ°è°ç¨è¿ç®ç¬¦çå·¦æä½æ°ï¼ä¾å¦ (p->*pmf)(args)ï¼ä»¥å¤çä»»ä½ç®çã
void 表达å¼
è¿å void ç彿°è°ç¨è¡¨è¾¾å¼ï¼è½¬æ¢ä¸º void ç转å表达å¼ï¼ä»¥å throw 表达å¼ï¼è¢«å½ç±»ä¸ºçº¯å³å¼è¡¨è¾¾å¼ï¼ä½å®ä»¬ä¸è½ç¨æ¥åå§åå¼ç¨æè
ä½ä¸ºå½æ°å®åãå®ä»¬å¯ä»¥ç¨å¨èå¼å¼çè¯å¢ï¼ä¾å¦èªæä¸è¡ï¼ä½ä¸ºéå·è¿ç®ç¬¦çå·¦æä½æ°çï¼åè¿å void ç彿°ä¸ç return è¯å¥ä¸ãå¦å¤ï¼throw 表达å¼å¯ç¨ä½æ¡ä»¶è¿ç®ç¬¦ ?: ç第äºä¸ªå第ä¸ä¸ªæä½æ°ã
|
void è¡¨è¾¾å¼æ²¡æç»æå¯¹è±¡ã |
(C++17 èµ·) |
ä½å
代表æä¸ªä½åç表达å¼ï¼ä¾å¦ a.mï¼å
¶ä¸ a æ¯ç±»å struct A { int m: 3; } çå·¦å¼ï¼æ¯å·¦å¼è¡¨è¾¾å¼ï¼å®å¯ç¨ä½èµå¼è¿ç®ç¬¦çå·¦æä½æ°ï¼ä½å®ä¸è½è¢«åå°åï¼å¹¶ä¸é const çå·¦å¼å¼ç¨ä¸è½ç»å®äºå®ãconst å·¦å¼å¼ç¨å¯ä»¥ä»¥ä½åå·¦å¼è¿è¡åå§åï¼ä½è¿ä¼å¶é ä½åçä¸ä¸ªä¸´æ¶å¯æ¬ï¼å®ä¸ä¼ç´æ¥ç»å®å°ä½åã
åå²
CPL
ç¼ç¨è¯è¨ CPL çå 为表达å¼å¼å ¥äºå¼ç±»å«ï¼ææ CPL 表达å¼é½è½ä»¥âå³ä¾§æ¨¡å¼ (right-hand mode)âæ±å¼ï¼ä½åªææäºç±»åç表达å¼å¨âå·¦ä¾§æ¨¡å¼ (left-hand mode)âææä¹ãå¨å³ä¾§æ¨¡å¼ä¸æ±å¼æ¶ï¼è¡¨è¾¾å¼è¢«å½å䏿¡è¿è¡å¼ç计ç®ï¼å³ä¾§å¼ï¼æå³å¼ï¼çè§åãå¨å·¦ä¾§æ¨¡å¼ä¸æ±å¼æ¶ï¼è¡¨è¾¾å¼çææå为ç»åºä¸ä¸ªå°åï¼å·¦ä¾§å¼ï¼æå·¦å¼ï¼ãâå·¦âåâå³â代表âèµå¼ä¹å·¦âåâèµå¼ä¹å³âã
C
C ç¼ç¨è¯è¨éµå¾ªç¸ä¼¼çåç±»æ³ï¼ä½èµå¼çä½ç¨ä¸åéè¦ï¼C ç表达å¼è¢«å为âå·¦å¼ (lvalue) 表达å¼âåå ¶ä»ï¼å½æ°åé对象å¼ï¼ï¼å ¶ä¸âå·¦å¼ (lvalue)âçå«ä¹ä¸ºæ è¯ä¸ä¸ªå¯¹è±¡ç表达å¼ï¼å³âå®ä½å¨å¼ (locator value)â[4]ã
C++98
2011 å¹´åç C++ éµå¾ª C 模åï¼ä½æ¢å¤äºå¯¹éå·¦å¼è¡¨è¾¾å¼çâå³å¼ (rvalue)âç§°å¼ï¼ä»¤å½æ°ä¸ºå·¦å¼ï¼å¹¶æ·»å äºå¼ç¨è½ç»å®å°å·¦å¼ä½å¯æ const çå¼ç¨è½ç»å®å°å³å¼çè§åãå ç§éå·¦å¼ç C 表达å¼å¨ C++ ä¸æä¸ºäºå·¦å¼è¡¨è¾¾å¼ã
C++11
éçç§»å¨è¯ä¹å¼å ¥å° C++11 ä¹ä¸ï¼å¼ç±»å«è¢«éæ°è¿è¡äºå®ä¹ï¼ä»¥åºå«è¡¨è¾¾å¼ç两ç§ç¬ç«çæ§è´¨[5]ï¼
- æ¥æèº«ä»½ (identity)ï¼å¯ä»¥ç¡®å®è¡¨è¾¾å¼æ¯å¦ä¸å¦ä¸è¡¨è¾¾å¼æä»£åä¸å®ä½ï¼ä¾å¦éè¿æ¯è¾å®ä»¬ææ è¯ç对象æå½æ°çï¼ç´æ¥æé´æ¥è·å¾çï¼å°åï¼
- å¯è¢«ç§»å¨ï¼ç§»å¨æé 彿°ãç§»å¨èµå¼è¿ç®ç¬¦æå®ç°äºç§»å¨è¯ä¹çå ¶ä»å½æ°éè½½è½å¤ç»å®äºè¿ä¸ªè¡¨è¾¾å¼ã
C++11 ä¸ï¼
- æ¥æèº«ä»½ä¸ä¸å¯è¢«ç§»å¨ç表达å¼è¢«ç§°ä½å·¦å¼ (lvalue)表达å¼ï¼
- æ¥æèº«ä»½ä¸å¯è¢«ç§»å¨ç表达å¼è¢«ç§°ä½äº¡å¼ (xvalue)表达å¼ï¼
- 䏿¥æèº«ä»½ä¸å¯è¢«ç§»å¨ç表达å¼è¢«ç§°ä½çº¯å³å¼ (prvalue)表达å¼ï¼
- 䏿¥æèº«ä»½ä¸ä¸å¯è¢«ç§»å¨çè¡¨è¾¾å¼æ æ³ä½¿ç¨[6]ã
æ¥æèº«ä»½ç表达å¼è¢«ç§°ä½âæ³å·¦å¼ (glvalue) 表达å¼âãå·¦å¼å亡å¼é½æ¯æ³å·¦å¼è¡¨è¾¾å¼ã
å¯è¢«ç§»å¨ç表达å¼è¢«ç§°ä½âå³å¼ (rvalue) 表达å¼âã纯å³å¼å亡å¼é½æ¯å³å¼è¡¨è¾¾å¼ã
C++17
C++17 ä¸ï¼æäºåºå强å¶è¦æ±è¿è¡å¤å¶æ¶é¤ï¼èè¿è¦æ±å°çº¯å³å¼è¡¨è¾¾å¼ä»è¢«å®ä»¬æåå§åç临æ¶å¯¹è±¡ä¸åç¦»åºæ¥ï¼è¿å°±æ¯æä»¬ç°æçç³»ç»ãè¦æ³¨æï¼ä¸ C++11 çæ¹æ¡ç¸æ¯ï¼çº¯å³å¼å·²ä¸åæ¯å¯è¢«ç§»å¨ã
èæ³¨
- â å设 i å ·æå 建类åï¼æè å ¶åç½®èªå¢è¿ç®ç¬¦è¢«é载为è¿åå·¦å¼å¼ç¨ã
- â 2.0 2.1 2.2 2.3 ä¸ç§ç¹æ®çå³å¼ç±»å«ï¼åè§æªå³æå彿°è°ç¨ã
- â åå® i å ·æå 建类åï¼æå ¶åç½®èªå¢è¿ç®ç¬¦å¹¶æªé载为è¿åå·¦å¼å¼ç¨ã
- â âC 社åºä¸å¯¹æ¤çè§ç¹ä¸»è¦å´ç»ç lvalue çå«ä¹èææå·®å¼ï¼ä¸ç»äººè®¤ä¸º lvalue æ¯ä»»ä½ç§ç±»ç对象å®ä½å¨ï¼å¦ä¸ç»äººè®¤ä¸º lvalue å¨èµå¼è¿ç®ç¬¦çå·¦ä¾§æ¶æææä¹ãC89 å§åä¼é纳äºä½ä¸ºå¯¹è±¡å®ä½å¨çå®ä¹ãâââ ANSI C åºæ¬åçï¼6.3.2.1/10 ã
- â æ°Â·å¼æ¯è¯ï¼Bjarne Stroustrupï¼2010ã
- â const 纯å³å¼ï¼ä» å 许类类åï¼å const 亡å¼ä¸è½ç»å®äº T&& çéè½½ï¼ä½å®ä»¬å¯ä»¥ç»å®äº const T&& çéè½½ââç±äºå ¶æ»¡è¶³è¿ç§åç±»ä¸çâå¯è¢«ç§»å¨âçå®ä¹ï¼æ åä¸å°è¿ç§éè½½ä¹å½ç±»ä¸ºâç§»å¨æé 彿°âåâç§»å¨èµå¼è¿ç®ç¬¦âãç¶èï¼è¿ç§éè½½æ æ³ä¿®æ¹å®ä»¬çåæ°ï¼å¹¶ä¸å¨å®è·µä¸å¹¶ä¸ä½¿ç¨ï¼å½æ²¡æè¿ç§éè½½æ¶ï¼const 纯å³å¼å const 亡å¼ç»å®äº const T& çéè½½ã
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 616 | C++11 | å³å¼çæå访é®åéè¿æåæéçæå访é®çç»æä¸ºçº¯å³å¼ | éåç±»ä¸ºäº¡å¼ |
| CWG 1213 | C++11 | æ°ç»å³å¼ç䏿 æä½å¯¼è´å·¦å¼ | éåç±»ä¸ºäº¡å¼ |