婧愭枃绔犳潵鑷墠C++鏍囧噯濮斿憳浼?xì)鐨?nbsp;Danny Kalev 鐨?nbsp;The Biggest Changes in C++11 (and Why You Should Care)錛岃禆鍕囨旦鍋氫簡(jiǎn)涓涓?a target="_blank">涓枃緲昏瘧鍦ㄨ繖閲?/a>銆傛墍浠ワ紝鎴戝氨涓嶇炕璇戜簡(jiǎn)錛屾垜鍦ㄨ繖閲屼粎瀵規(guī)枃涓彁鍒扮殑榪欎簺鍙樺寲“榪介棶涓轟粈涔堣寮曞叆榪欎簺鍙樺寲”鐨勪竴涓帰璁紝鍙湁鐭ラ亾涓轟簡(jiǎn)浠涔堬紝鐢ㄥ湪浠涔堝湴鏂癸紝鎴戜滑鎵嶈兘鐪熸瀛﹀埌榪欎釜鐭ヨ瘑銆傝屼互姝や綘鍙互鏇存繁鍏ュ湴浜?jiǎn)瑙q欎簺鍙樺寲銆傛墍浠ワ紝鏈枃涓嶆槸緲昏瘧銆傚洜涓哄啓寰楁湁浜涗粨淇?jī)锛屾墍浠ラ毦鍏嶆湁闂錛岃繕璇峰ぇ瀹舵寚姝c?/p>
Lambda琛ㄨ揪寮忔潵婧愪簬鍑芥暟寮忕紪紼嬶紝璇寸櫧灝變簡(jiǎn)灝辨槸鍦ㄤ嬌鐢ㄧ殑鍦版柟瀹氫箟鍑芥暟錛屾湁鐨勮璦鍙?#8220;闂寘”錛屽鏋?lambda 鍑芥暟娌℃湁浼犲洖鍊?渚嬪 void )錛屽叾鍥炶繑綾誨瀷鍙瀹屽叏蹇界暐銆?瀹氫箟鍦ㄤ笌 lambda 鍑芥暟鐩稿悓浣滅敤鍩熺殑鍙橀噺鍙傝冧篃鍙互琚嬌鐢ㄣ傝繖縐嶇殑鍙橀噺闆嗗悎涓鑸縐頒綔 closure錛堥棴鍖咃級(jí)銆傛垜鍦ㄨ繖閲屽氨涓嶅啀璁茶繖涓簨浜?jiǎn)銆傝〃杈懼紡鐨勭畝鍗曡娉曞涓嬶紝
1 |
[capture](parameters)->return_type {body} |
鍘熸枃鐨勪綔鑰呯粰鍑轟簡(jiǎn)涓嬮潰鐨勪緥瀛愶細(xì)
1
2
3
4
5
6
7
8
9
10 |
int main() { char s[]= "Hello World!" ; int Uppercase = 0; //modified by the lambda for_each(s, s+ sizeof (s), [&Uppercase] ( char c) { if ( isupper (c)) Uppercase++; }); cout << Uppercase << " uppercase letters in: " << s <<endl; } |
鍦ㄤ紶緇熺殑STL涓璮or_each() 榪欎釜鐜╂剰鏈鍚庨偅涓弬鏁伴渶瑕佷竴涓?#8220;鍑芥暟瀵硅薄”錛屾墍璋撳嚱鏁板璞★紝鍏跺疄鏄竴涓猚lass錛岃繖涓猚lass閲嶈澆浜?jiǎn)operator()錛屼簬鏄繖涓璞″彲浠ュ儚鍑芥暟鐨勫紡鏍風(fēng)殑浣跨敤銆傚疄鐜頒竴涓嚱鏁板璞″茍涓嶅鏄擄紝闇瑕佷嬌鐢╰emplate錛屾瘮濡備笅闈㈣繖涓緥瀛愬氨鏄嚱鏁板璞$殑綆鍗曚緥瀛愶紙瀹為檯鐨勫疄鐜拌繙姣旇繖涓鏉傦級(jí)錛?/p>
1
2
3
4
5
6
7
8
9 |
template < class T> class less { public : bool operator()( const T&l, const T&r) const { return l < r; } }; |
鎵浠ワ紝C++寮曞叆Lambda鐨勬渶涓昏鍘熷洜灝辨槸1錛夊彲浠ュ畾涔夊尶鍚嶅嚱鏁幫紝2錛夌紪璇戝櫒浼?xì)鎶婂叾铦{鎴愬嚱鏁板璞?/strong>銆傜浉淇′綘浼?xì)鍜屾垜涓鏍鳳紝浼?xì)鐤戦棶湄?fù)浠涔堜互鍓峉TL涓殑ptr_fun()榪欎釜鍑芥暟瀵硅薄涓嶈兘鐢紵錛坧tr_fun()灝辨槸鎶婁竴涓嚜鐒跺嚱鏁拌漿鎴愬嚱鏁板璞$殑錛夈傚師鍥犳槸錛宲tr_fun() 鐨勫眬闄愭槸鍏舵帴鏀剁殑鑷劧鍑芥暟鍙兘鏈?鎴?涓弬鏁般?/p>
閭d箞錛岄櫎浜?jiǎn)鏂逛究澶栧Q屼負(fù)浠涔堜竴瀹氳浣跨敤Lambda鍛紵瀹冩瘮浼犵粺鐨勫嚱鏁版垨鏄嚱鏁板璞℃湁浠涔堝ソ澶勫憿錛熸垜涓漢鎵鐞嗚В鐨勬槸錛岃繖縐嶅嚱鏁頒箣騫翠互鍙?#8220;闂寘”錛屽氨鏄洜涓哄叾闄愬埗浜?jiǎn)鍒汉鐨勮畨K棶錛屾洿縐佹湁銆備篃鍙互璁や負(fù)浠栨槸涓嬈℃х殑鏂規(guī)硶銆侺ambda琛ㄨ揪寮忓簲璇ユ槸綆媧佺殑錛屾瀬縐佹湁鐨勶紝涓轟簡(jiǎn)鏇存槗鐨勪唬鐮佸拰鏇存柟渚跨殑緙栫▼銆?/p>
鍦ㄨ繖涓鑺備腑錛屽師鏂囦富瑕佷粙緇嶄簡(jiǎn)涓や釜鍏抽敭瀛?auto 鍜?deltype錛岀ず渚嬪涓嬶細(xì) auto 鏈澶х殑濂藉灝辨槸璁╀唬鐮佺畝媧侊紝灝ゅ叾鏄偅浜涙ā鏉跨被鐨勫0鏄庯紝姣斿錛歋TL涓殑瀹瑰櫒鐨勮凱浠e瓙綾誨瀷銆?/p>
鍙互鍙樻垚錛?/p>
妯℃澘榪欎釜鐗規(guī)цC++鐨勪唬鐮佸彉寰楀緢闅捐錛屼笉淇′綘鍙互鐪嬬湅STL鐨勬簮鐮侊紝閭f槸涓涓貢鍟娿備嬌鐢╝uto蹇呴渶涓涓垵濮嬪寲鍊鹼紝緙栬瘧鍣ㄥ彲浠ラ氳繃榪欎釜鍒濆鍖栧兼帹瀵煎嚭綾誨瀷銆傚洜涓篴uto鏄潵綆鍖栨ā鏉跨被寮曞叆鐨勪唬鐮侀毦璇葷殑闂錛屽涓婇潰鐨勭ず渚嬶紝iteration榪欑綾誨瀷灝辨渶閫傚悎鐢╝uto鐨勶紝浣嗘槸錛屾垜浠笉搴旇鎶婂叾婊ョ敤銆?/p>
姣斿涓嬮潰鐨勪唬鐮佺殑鍙鎬у氨闄嶄綆浜?jiǎn)銆傚洜涓猴紝鎴戜笉鐭ラ亾P(yáng)rocessData榪斿洖浠涔堬紵int? bool? 榪樻槸瀵硅薄錛熸垨鏄埆鐨勪粈涔堬紵榪欒浣犲悗闈㈢殑紼嬪簭涓嶇煡閬撴庝箞鍋氥?/p>
浣嗘槸涓嬮潰鐨勭▼搴忓氨娌℃湁闂錛屽洜涓簆Object鐨勫瀷鍒湪鍚庨潰鐨刵ew涓湁浜?jiǎn)銆?/p>
鍏充簬 鍘熸枃緇欏嚭鐨勭ず渚嬪涓嬶紝鎴戜滑鍙互鐪嬪埌錛岃繖涓鐨勭‘鎴戜滑鐨勫畾涔夊彉閲忕渷浜?jiǎn)寰堝浜嬨?/p>
榪樻湁涓涓傚悎鐨勭敤娉曟槸鐢ㄦ潵typedef鍑芥暟鎸囬拡錛屼篃浼?xì)鐪佸緢澶氫簨銆傛瘮濡傦細(xì) Wikipedia 涓婃槸榪欎箞璇寸殑錛堝叧浜巇ecltype鐨勮鍒欒涓婏級(jí) 濡傛灉auto 鍜?decltype 鍦ㄤ竴璧蜂嬌鐢ㄤ細(xì)鏄粈涔堟牱瀛愶紵鑳界湅涓嬮潰鐨勭ず渚嬶紝涓嬮潰榪欎釜紺轟緥涔熸槸寮曞叆decltype鐨勪竴涓師鍥?#8212;—璁〤++鏈夎兘鍔涘啓涓涓?“ forwarding function 妯℃澘”錛?/p>
榪欎釜鍑芥暟妯℃澘鐪嬭搗鏉ョ浉褰撹垂瑙o紝鍏剁敤鍒頒簡(jiǎn)auto 鍜?decltype 鏉ユ墿灞曚簡(jiǎn)宸叉湁鐨勬ā鏉挎妧鏈殑涓嶈凍銆傛庝箞涓笉瓚沖憿錛熷湪涓婁緥涓紝鎴戜笉鐭ラ亾AddingFunc浼?xì)鎺ユ敹浠涔堟牱綾誨瀷鐨勫璞★紝榪欎袱涓璞$殑 + 鎿嶄綔絎﹁繑鍥炵殑綾誨瀷涔熶笉鐭ラ亾錛岃佺殑妯℃澘鍑芥暟鏃犳硶瀹氫箟AddingFunc榪斿洖鍊煎拰榪欎袱涓璞$浉鍔犲悗鐨勮繑鍥炲煎尮閰嶏紝鎵浠ワ紝浣犲彲浠ヤ嬌鐢ㄤ笂榪扮殑榪欑瀹氫箟銆?/p>
C/C++鐨勫垵濮嬪寲鐨勬柟娉曟瘮杈冿紝C++ 11 鐢ㄥぇ鎷彿緇熶竴浜?jiǎn)杩欎簺鍒濆鍖栫殑鏂规硶銆?/p>
姣斿錛歅OD鐨勭被鍨嬨?/p>
鍏充簬POD鐩歌涓ゅ彞錛屾墍璋揚(yáng)OD灝辨槸Plain Old Data錛屽綋class/struct鏄?em>鏋佺畝鐨?trivial)銆佸睘浜?em>鏍囧噯甯冨眬(standard-layout)錛屼互鍙?qiáng)浠栫殑鎵鏈夐潪闈?rùn)鎬侊紙non-static錛夋垚鍛橀兘鏄疨OD鏃訛紝浼?xì)琚湄?fù)POD銆傚錛?/p>
POD鐨勫垵濮嬪寲鏈夌偣鎬紝姣斿涓婁緥錛宯ew A; 鍜宯ew A(); 鏄笉涓鏍風(fēng)殑錛屽浜庡叾鍐呴儴鐨刴錛屽墠鑰呮病鏈夎鍒濆鍖栵紝鍚庤呰鍒濆鍖栦簡(jiǎn)錛堜笉鍚?鐨勭紪璇戝櫒琛屼負(fù)涓嶄竴鏍鳳紝VC++鍜孏CC涓嶄竴鏍鳳級(jí)銆傝岄潪POD鐨勫垵濮嬪寲錛屽垯閮戒細(xì)琚垵濮嬪寲銆?/p>
浠庤繖鐐瑰彲浠ョ湅鍑猴紝C/C++鐨勫垵濮嬪寲闂寰堝鎬紝鎵浠ワ紝鍦–++ 2011鐗堜腑灝卞仛浜?jiǎn)缁熶竴銆傚師鏂囦綔鑰呯粰鍑轟簡(jiǎn)濡備笅鐨勭ず渚嬶細(xì) 瀹瑰櫒鐨勫垵濮嬪寲錛?/p>
榪樻敮鎸佸儚Java涓鏍風(fēng)殑鎴愬憳鍒濆鍖栵細(xì) 鎴戜滑鐭ラ亾C++鐨勭紪璇戝櫒鍦ㄤ綘娌℃湁瀹氫箟鏌愪簺鎴愬憳鍑芥暟鐨勬椂鍊欎細(xì)緇欎綘鐨勭被鑷姩鐢熸垚榪欎簺鍑芥暟錛屾瘮濡傦紝鏋勯犲嚱鏁幫紝鎷瘋礉鏋勯狅紝鏋愭瀯鍑芥暟錛岃祴鍊煎嚱鏁般傛湁浜涙椂鍊欙紝鎴戜滑涓嶆兂瑕佽繖浜涘嚱鏁幫紝姣斿錛屾瀯閫犲嚱鏁幫紝鍥犱負(fù)鎴戜滑鎯沖仛瀹炵幇鍗曚緥妯″紡銆備紶緇熺殑鍋氭硶鏄皢鍏跺0鏄庢垚private綾誨瀷銆?/p>
鍦ㄦ柊鐨凜++涓紩鍏ヤ簡(jiǎn)涓や釜鎸囩ず絎︼紝delete鎰忎負(fù)鍛婅瘔緙栬瘧鍣ㄤ笉鑷姩浜х敓榪欎釜鍑芥暟錛宒efault鍛婅瘔緙栬瘧鍣ㄤ駭鐢熶竴涓粯璁ょ殑銆傚師鏂囩粰鍑轟簡(jiǎn)涓嬮潰涓や釜渚嬪瓙錛?/p>
鍐嶅delete 榪欓噷錛屾垜鎯寵涓涓嬶紝涓轟粈涔堟垜浠渶瑕乨efault錛熸垜浠涔堥兘涓嶅啓涓嶅氨鏄痙efault鍚楋紵涓嶅叏鐒舵槸錛屾瘮濡傛瀯閫犲嚱鏁幫紝鍥犱負(fù)鍙浣犲畾涔変簡(jiǎn)涓涓瀯閫犲嚱鏁幫紝緙栬瘧鍣ㄥ氨涓嶄細(xì)緇欎綘鐢熸垚涓涓粯璁ょ殑浜?jiǎn)銆傛墍浠ワ紝涓轟簡(jiǎn)瑕佽榛樿鐨勫拰鑷畾涔夌殑鍏卞瓨錛屾墠寮曞叆榪欎釜鍙傛暟錛屽涓嬩緥鎵紺猴細(xì) 鍏充簬delete榪樻湁涓や釜鏈夌敤鐨勫湴鏂規(guī)槸 1錛夎浣犵殑瀵硅薄鍙兘鐢熸垚鍦ㄦ爤鍐呭瓨涓婏細(xì) 2錛夐樆姝㈠嚱鏁扮殑鍏跺艦鍙傜殑綾誨瀷璋冪敤錛氾紙鑻ュ皾璇曚互 double 鐨勫艦鍙傝皟鐢?nbsp; C/C++鐨凬ULL瀹忔槸涓鏈夊緢澶氭綔鍦˙UG鐨勫畯銆傚洜涓烘湁鐨勫簱鎶婂叾瀹氫箟鎴愭暣鏁?錛屾湁鐨勫畾涔夋垚 (void*)0銆傚湪C鐨勬椂浠h繕濂姐備絾鏄湪C++鐨勬椂浠o紝榪欏氨浼?xì)寮曞彂寰堝闂銆備綘鍙互涓婄綉鐪嬬湅銆傝繖鏄負(fù)浠涔堥渶瑕?nbsp; 鍦ㄤ互鍓嶇殑C++涓紝鏋勯犲嚱鏁頒箣闂翠笉鑳戒簰鐩歌皟鐢紝鎵浠ワ紝鎴戜滑鍦ㄥ啓榪欎簺鐩鎬技鐨勬瀯閫犲嚱鏁伴噷錛屾垜浠細(xì)鎶婄浉鍚岀殑浠g爜鏀懼埌涓涓鏈夌殑鎴愬憳鍑芥暟涓?/p>
浣嗘槸錛屼負(fù)浜?jiǎn)鏂逛究迤堜笉鑳鲨?#8220;濮旀墭鏋勯?#8221;榪欎釜浜嬪嚭鐜幫紝鏈涓昏鐨勯棶棰樻槸錛屽熀綾葷殑鏋勯犱笉鑳界洿鎺ユ垚涓烘淳鐢熺被鐨勬瀯閫狅紝灝辯畻鏄熀綾葷殑鏋勯犲嚱鏁板浜?jiǎn)锛寢z劇敓綾昏繕瑕佽嚜宸卞啓鑷繁鐨勬瀯閫犲嚱鏁幫細(xì) 涓婁緥涓紝媧劇敓綾繪墜鍔ㄧ戶鎵垮熀綾葷殑鏋勯犲嚱鏁幫紝 緙栬瘧鍣ㄥ彲浠ヤ嬌鐢ㄥ熀綾葷殑鏋勯犲嚱鏁板畬鎴愭淳鐢熺被鐨勬瀯閫犮?鑰屽皢鍩虹被鐨勬瀯閫犲嚱鏁板甫鍏ユ淳鐢熺被鐨勫姩浣?鏃犳硶閫夋嫨鎬у湴閮ㄥ垎甯﹀叆錛?鎵浠ワ紝瑕佷笉灝辨槸緇ф壙鍩虹被鍏ㄩ儴鐨勬瀯閫犲嚱鏁幫紝瑕佷笉灝辨槸涓涓兘涓嶇戶鎵?涓嶆墜鍔ㄥ甫鍏?銆?姝ゅ錛岃嫢鐗墊秹鍒板閲嶇戶鎵匡紝浠庡涓熀綾葷戶鎵胯屾潵鐨勬瀯閫犲嚱鏁頒笉鍙互鏈夌浉鍚岀殑鍑芥暟絳懼悕(signature)銆?鑰屾淳鐢熺被鐨勬柊鍔犲叆鐨勬瀯閫犲嚱鏁頒篃涓嶅彲浠ュ拰緇ф壙鑰屾潵鐨勫熀綾繪瀯閫犲嚱鏁版湁鐩稿悓鐨勫嚱鏁扮鍚嶏紝鍥犱負(fù)榪欑浉褰撲簬閲嶅澹版槑銆傦紙鎵璋撳嚱鏁扮鍚嶅氨鏄嚱鏁扮殑鍙傛暟綾誨瀷鍜岄『搴忎笉錛?/p>
鍦ㄨ佺増鐨凜++涓紝涓存椂鎬у彉閲忥紙縐頒負(fù)鍙沖?#8221;R-values”錛屼綅浜庤祴鍊兼搷浣滅涔嬪彸錛夌粡甯哥敤浣滀氦鎹袱涓彉閲忋傛瘮濡備笅闈㈢殑紺轟緥涓殑tmp鍙橀噺銆傜ず渚嬩腑鐨勯偅涓嚱鏁伴渶瑕佷紶閫掍袱涓猻tring鐨勫紩鐢紝浣嗘槸鍦ㄤ氦鎹㈢殑榪囩▼涓駭鐢熶簡(jiǎn)瀵硅薄鐨勬瀯閫狅紝鍐呭瓨鐨勫垎閰嶈繕鏈夊璞$殑鎷瘋礉鏋勯犵瓑絳夊姩浣滐紝鎴愭湰姣旇緝楂樸?/p>
C++ 11澧炲姞涓涓柊鐨勫紩鐢紙reference錛夌被鍨嬬О浣滃彸鍊煎紩鐢紙R-value reference錛夛紝鏍囪涓?tt>typename &&銆備粬浠兘澶熶互non-const鍊肩殑鏂瑰紡浼犲叆錛屽厑璁稿璞″幓鏀瑰姩浠栦滑銆傝繖欏逛慨姝e厑璁哥壒瀹氬璞″垱閫犲嚭move璇箟銆?/p>
涓句緥鑰岃█錛屼笂闈㈤偅涓緥瀛愪腑錛宻tring綾諱腑淇濆瓨浜?jiǎn)涓涓姩鎬佸唴瀛樺垎瀛樼殑char*鎸囬拡錛屽鏋滀竴涓猻tring瀵硅薄鍙戠敓鎷瘋礉鏋勯狅紙濡傦細(xì)鍑芥暟榪斿洖錛夛紝string綾婚噷鐨刢har*鍐呭瓨鍙兘閫氳繃鍒涘緩涓涓柊鐨勪復(fù)鏃跺璞★紝騫舵妸鍑芥暟鍐呯殑瀵硅薄鐨勫唴瀛榗opy鍒拌繖涓柊鐨勫璞′腑錛岀劧鍚庨攢姣佷復(fù)鏃跺璞″強(qiáng)鍏跺唴瀛樸?strong>榪欐槸鍘熸潵C++鎬ц兘涓婇噸鐐硅鎵硅瘎鐨勪簨鑷姩綾誨瀷鎺ㄥ auto
auto x=0;
//x has type int because 0 is int
auto c=
'a'
;
//char
auto d=0.5;
//double
auto national_debt=14400000000000LL;
//long long
vector<
int
>::const_iterator ci = vi.begin();
auto ci = vi.begin();
auto obj = ProcessData(someVariables);
auto pObject =
new
SomeType<OtherType>::SomeOtherType();
鑷姩鍖栨帹瀵?decltype
decltype
鏄竴涓搷浣滅錛屽叾鍙互璇勪及鎷彿鍐呰〃杈懼紡鐨勭被鍨嬶紝鍏惰鍒欏涓嬶細(xì)
const
vector<
int
> vi;
typedef
decltype (vi.begin()) CIT;
CIT another_const_iterator;
decltype(&myfunc) pfunc = 0;
typedef
decltype(&A::func1) type;
auto 鍜?decltype 鐨勫樊鍒拰鍏崇郴
#include <vector>
int
main()
{
const
std::vector<
int
> v(1);
auto a = v[0];
// a 鐨勭被鍨嬫槸 int
decltype(v[0]) b = 1;
// b 鐨勭被鍨嬫槸 const int&, 鍥犱負(fù)鍑芥暟鐨勮繑鍥炵被鍨嬫槸
// std::vector<int>::operator[](size_type) const
auto c = 0;
// c 鐨勭被鍨嬫槸 int
auto d = c;
// d 鐨勭被鍨嬫槸 int
decltype(c) e;
// e 鐨勭被鍨嬫槸 int, 鍥犱負(fù) c 鐨勭被鍨嬫槸int
decltype((c)) f = c;
// f 鐨勭被鍨嬫槸 int&, 鍥犱負(fù) (c) 鏄乏鍊?/code>
decltype(0) g;
// g 鐨勭被鍨嬫槸 int, 鍥犱負(fù) 0 鏄彸鍊?/code>
}
template
<
typename
LHS,
typename
RHS>
auto AddingFunc(
const
LHS &lhs,
const
RHS &rhs) -> decltype(lhs+rhs)
{
return
lhs + rhs;}
緇熶竴鐨勫垵濮嬪寲璇硶
int
arr[4]={0,1,2,3};
struct
tm
today={0};
struct
A {
int
m; };
// POD
struct
B { ~B();
int
m; };
// non-POD, compiler generated default ctor
struct
C { C() : m() {}; ~C();
int
m; };
// non-POD, default-initialising m
C c {0,0};
//C++11 only. 鐩稿綋浜? C c(0,0);
int
* a =
new
int
[3] { 1, 2, 0 }; /C++11 only
class
X {
int
a[4];
public
:
X() : a{1,2,3,4} {}
//C++11, member array initializer
};
// C++11 container initializer
vector<string> vs={
"first"
,
"second"
,
"third"
};
map singers =
{ {
"Lady Gaga"
,
"+1 (212) 555-7890"
},
{
"Beyonce Knowles"
,
"+1 (212) 555-0987"
}};
class
C
{
int
a=7;
//C++11 only
public
:
C();
};
Delete 鍜?Default 鍑芥暟
struct
A
{
A()=
default
;
//C++11
virtual
~A()=
default
;
//C++11
};
struct
NoCopy
{
NoCopy & operator =(
const
NoCopy & ) =
delete
;
NoCopy (
const
NoCopy & ) =
delete
;
};
NoCopy a;
NoCopy b(a);
//compilation error, copy ctor is deleted
struct
SomeType
{
SomeType() =
default
;
// 浣跨敤緙栬瘧鍣ㄧ敓鎴愮殑榛樿鏋勯犲嚱鏁?/code>
SomeType(OtherType value);
};
struct
NonNewable {
void
*operator
new
(std::
size_t
) =
delete
;
};
f()
錛屽皢浼?xì)寮曞彂缂栬瘧鏈熼敊璇Q?緙栬瘧鍣ㄤ笉浼?xì)鑷姩灏?double 褰㈠弬杞瀷涓?int 鍐嶈皟鐢?code>f()錛屽鏋滀紶鍏ョ殑鍙傛暟鏄痙ouble錛屽垯浼?xì)鍑虹幇缂栬瘧閿欒锛?jí)
void
f(
int
i);
void
f(
double
) =
delete
;
nullptr
nullptr
鐨勫師鍥犮?nbsp;nullptr
鏄己綾誨瀷鐨勩?/p>
void
f(
int
);
//#1
void
f(
char
*);
//#2
//C++03
f(0);
//浜屼箟鎬?/code>
//C++11
f(nullptr)
//鏃犱簩涔夋э紝璋冪敤f(char*)
鎵浠ュ湪鏂扮増涓浠?nullptr
鍒濆鍖栨寚閽堛?/p>
濮旀墭鏋勯?/h4>
class
SomeType {
private
:
int
number;
string name;
SomeType(
int
i, string& s ) : number(i), name(s){}
public
:
SomeType( ) : SomeType( 0,
"invalid"
){}
SomeType(
int
i ) : SomeType( i,
"guest"
){}
SomeType( string& s ) : SomeType( 1, s ){ PostInit(); }
};
class
BaseClass
{
public
:
BaseClass(
int
iValue);
};
class
DerivedClass :
public
BaseClass
{
public
:
using
BaseClass::BaseClass;
};
鍙沖煎紩鐢ㄥ拰move璇箟
void
naiveswap(string &a, string &b)
{
string temp = a;
a=b;
b=temp;
}
鑳借繃鍙沖煎紩鐢紝string鐨勬瀯閫犲嚱鏁伴渶瑕佹敼鎴?#8220;move鏋勯犲嚱鏁?#8221;錛屽涓嬫墍紺恒傝繖鏍蜂竴鏉ワ紝浣垮緱瀵規(guī)煇涓?span style="font-family: monospace">stirng鐨勫彸鍊煎紩鐢ㄥ彲浠ュ崟綰湴浠庡彸鍊煎鍒跺叾鍐呴儴C-style鐨勬寚閽堝埌鏂扮殑string錛岀劧鍚庣暀涓嬬┖鐨勫彸鍊箋傝繖涓搷浣滀笉闇瑕佸唴瀛樻暟緇勭殑澶嶅埗錛岃屼笖絀虹殑鏆傛椂瀵硅薄鐨勬瀽鏋勪篃涓嶄細(xì)閲婃斁鍐呭瓨銆傚叾鏇存湁鏁堢巼銆?/p>
1
2
3
4
5 |
class string { string (string&&); //move constructor string&& operator=(string&&); //move assignment operator }; |
The C++11 STL涓箍娉涘湴浣跨敤浜?jiǎn)鍙冲煎紩鐢ㄥ拰move璇銆傚洜姝わ紝寰堝綆楁硶鍜屽鍣ㄧ殑鎬ц兘閮借浼樺寲浜?jiǎn)銆?/p>
C++ STL搴撳湪2003騫寸粡鍘嗕簡(jiǎn)寰堝ぇ鐨勬暣瀹規(guī)墜鏈?nbsp;Library Technical Report 1 (TR1)銆?TR1 涓嚭鐜頒簡(jiǎn)寰堝鏂扮殑瀹瑰櫒綾?(unordered_set
, unordered_map
, unordered_multiset
, 鍜?nbsp;unordered_multimap
) 浠ュ強(qiáng)涓浜涙柊鐨勫簱鏀寔璇稿錛氭鍒欒〃杈懼紡錛?tuples錛屽嚱鏁板璞″寘瑁咃紝絳夌瓑銆?C++11 鎵瑰噯浜?TR1 鎴愪負(fù)姝e紡鐨凜++鏍囧噯錛岃繕鏈変竴浜汿R1 鍚庢柊鍔犵殑涓浜涘簱錛屼粠鑰屾垚涓轟簡(jiǎn)鏂扮殑C++ 11 STL鏍囧噯搴撱傝繖涓簱涓昏鍖呭惈涓嬮潰鐨勫姛鑳斤細(xì)
榪欎滑灝變笉澶氳浜?jiǎn)锛屼互鍓嶇殑STL楗卞彈綰跨▼瀹夊叏鐨勬壒璇勩傜幇鍦ㄥソ 浜?jiǎn)銆侰++ 11 鏀寔綰跨▼綾諱簡(jiǎn)銆傝繖灝嗘秹鍙?qiáng)涓や釜閮ㄥ垎锛?xì)絎竴銆佽璁′竴涓彲浠ヤ嬌澶氫釜綰跨▼鍦ㄤ竴涓繘紼嬩腑鍏卞瓨鐨勫唴瀛樻ā鍨嬶紱絎簩銆佷負(fù)綰跨▼涔嬮棿鐨勪氦浜掓彁渚涙敮鎸併傜浜岄儴鍒嗗皢鐢辯▼搴忓簱鎻愪緵鏀寔銆傚ぇ瀹跺彲浠ョ湅鐪?a target="_blank">promises and futures錛屽叾鐢ㄤ簬瀵硅薄鐨勫悓姝ャ?nbsp;async() 鍑芥暟妯℃澘鐢ㄤ簬鍙戣搗騫跺彂浠誨姟錛岃?nbsp;thread_local 涓虹嚎紼嬪唴鐨勬暟鎹寚瀹氬瓨鍌ㄧ被鍨嬨傛洿澶氱殑涓滆タ錛屽彲浠ユ煡鐪?Anthony Williams鐨?nbsp;Simpler Multithreading in C++0x.
C++98 鐨勭煡鑳芥寚閽堟槸 auto_ptr錛?鍦–++ 11涓搴熷純浜?jiǎn)銆?/code>C++11 寮曞叆浜?jiǎn)涓や釜鎸囬拡绫诲Q?nbsp;shared_ptr 鍜?unique_ptr銆?shared_ptr鍙槸鍗曠函鐨勫紩鐢ㄨ鏁版寚閽堬紝
銆?nbsp;unique_ptr 鏄敤鏉ュ彇浠?code>auto_ptr
unique_ptr
鎻愪緵 auto_ptr
澶ч儴浠界壒鎬э紝鍞竴鐨勪緥澶栨槸 auto_ptr
鐨勪笉瀹夊叏銆侀殣鎬х殑宸﹀兼惉縐匯備笉鍍?nbsp;auto_ptr
錛?code>unique_ptr 鍙互瀛樻斁鍦?C++0x 鎻愬嚭鐨勯偅浜涜兘瀵熻鎼Щ鍔ㄤ綔鐨勫鍣ㄤ箣涓?/p>
涓轟粈涔堣榪欎箞騫詫紵澶у鍙互鐪嬬湅銆奙ore Effective C++銆嬩腑瀵?auto_ptr鐨勮璁恒?/p>
瀹氫箟浜?jiǎn)涓浜涙柊鐨勭畻娉曪細(xì) all_of()
, any_of()
鍜?nbsp;none_of()銆?/code>
1
2
3
4
5
6
7
8 |
#include <algorithm> //C++11 code //are all of the elements positive? all_of(first, first+n, ispositive()); //false //is there at least one positive element? any_of(first, first+n, ispositive()); //true // are none of the elements positive? none_of(first, first+n, ispositive()); //false |
浣跨敤鏂扮殑copy_n()綆楁硶錛屼綘鍙互寰堟柟渚垮湴鎷瘋礉鏁扮粍銆?/p>
1
2
3
4
5 |
#include <algorithm> int source[5]={0,12,34,50,80}; int target[5]; //copy 5 elements from source to target copy_n(source,5,target); |
浣跨敤 iota()
鍙互鐢ㄦ潵鍒涘緩閫掑鐨勬暟鍒椼傚涓嬩緥鎵紺猴細(xì)
1
2
3
4
5 |
include <numeric> int a[5]={0}; char c[3]={0}; iota(a, a+5, 10); //changes a to {10,11,12,13,14} iota(c, c+3, 'a' ); //{'a','b','c'} |
鎬諱箣錛岀湅涓嬫潵錛孋++11 榪樻槸寰堝闄㈡淳錛屽緢澶氬疄鐢ㄧ殑涓滆タ榪樻槸娌℃湁錛屾瘮濡傦細(xì) XML錛宻ockets錛宺eflection錛屽綋鐒惰繕鏈夊瀮鍦懼洖鏀躲傜湅鏉ヨ絳夊埌C++ 20浜?jiǎn)銆傚懙鍛點(diǎn)備笉榪嘋++ 11鍦ㄦц兘涓婅繕鏄緢蹇傚弬鐪?Google’s benchmark tests銆傚師鏂囪繕寮曠敤Stroustrup 鐨勮鐐癸細(xì)C++11 鏄竴闂ㄦ柊鐨勮璦——涓涓洿濂界殑 C++銆?/p>
濡傛灉鎶婃墍鏈夌殑鏀瑰彉閮藉垪鍑烘潵錛屼綘浼?xì)鍙戠幇鐪熷鍟娿傛垜浼拌C++ Primer閭f湰涔︾殑鍘氬害瑕佸鍔犺嚦灝?0%浠ヤ笂銆侰++鐨勯棬妲涗細(xì)涓嶄細(xì)瓚婃潵瓚婇珮浜?jiǎn)鍛㈠Q熸垜涓嶇煡閬擄紝浣嗘垜涓漢瑙夊緱榪欓棬璇█鐨勭‘鏄彉寰楄秺鏉ヨ秺浠や漢鏈涜屽嵈姝ヤ簡(jiǎn)銆傦紙鎯寵搗浜?jiǎn)鏌愪汉鍜屾垜璇寸殑涓鍙ヨ瘽——瀛︽妧鏈湡鐨勬槸澶瘡浜?jiǎn)锛寴q樻槸鎼炴柟娉曡濂芥販浜涳紵錛?/p>
Status Of C++ 0x Language Features in Compilers | |||||||||||
C++ 0x FEATURE |
PAPER(S) |
HP aCC |
EDG eccp |
Sun/ Oracle C++ |
Digital Mars C++ |
||||||
alignas |
4.8 |
3.0 | |||||||||
alignof |
4.5 |
Yes |
2.9 | ||||||||
Atomic operations |
4.4 |
13.0 |
11.0 |
3.1 | |||||||
auto |
4.1(v0.9) |
4.4(v1.0) |
11.0(v0.9) |
10.0(v0.9) |
11.1 (V1.0) |
Yes | |||||
C99 preprocessor |
4.3 |
11.1 |
10.1 |
5.9 |
Yes |
Yes | |||||
Concepts [removed] |
|
||||||||||
constexpr |
4.6 |
13.0 |
12.1 |
3.1 | |||||||
decltype |
4.1(v1.0) |
4.3(v1.0) 4.8.1(v1.1) |
11.0(v1.0) |
10.0(v1.0), 11.0(v1.1) |
11.1 (V1.0) |
Yes |
2.9 | ||||
Defaulted And Deleted Functions |
4.1 |
4.4 |
12.0 |
3.0 | |||||||
Delegating Constructors |
4.7 |
|
11.0 nov'12 |
11.1 |
3.0 | ||||||
Explicit conversion operators |
4.5 |
13.0 |
11.0 nov'12 |
12.1 |
Yes |
3.0 | |||||
Extended friend Declarations |
4.1 |
4.7 |
11.0 |
10.0*** |
V1R11,11.1 |
2.9 | |||||
extern template |
3, 5, 6 |
3.3 |
9 |
6.0 |
V1R11,11.1 |
Yes |
Yes | ||||
Forward declarations for enums |
4.6 |
11.0 |
12.1 |
3.1 | |||||||
Inheriting Constructors |
4.8 |
|
|
||||||||
Initializer Lists |
4.4 |
13.0 |
11.0 nov'12 |
3.1 | |||||||
Lambda expressions and closures |
4.1(v0.9) |
4.5(v1.1) |
11.0(v0.9) |
10.0(v1.0), 11.0(v1.1) |
3.1 | ||||||
Local and Unnamed Types as Template Arguments |
4.5 |
12.0 |
10.0 |
2.9 | |||||||
long long |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes | |
Namespace Association |
4.4 |
|
11.1 |
2.9 | |||||||
New character types |
4.4 |
2.9 | |||||||||
New function declaration syntax for deduced return types |
4.1 |
4.4 |
12.1 |
10.0 |
12.1 |
2.9 | |||||
nullptr |
4.6 |
12.1* |
10.0 |
2.9 | |||||||
Unicode String Literals |
4.4 |
11.0* |
5.7 |
Yes |
3.0 | ||||||
Raw String Literals |
4.5 |
|
11.0 nov'12 |
Yes | |||||||
User-defined Literals |
4.7 |
3.1 | |||||||||
Right Angle Brackets |
4.1 |
4.3 |
11.0 |
8.0 |
12.1 |
Yes | |||||
R-Value References, std::move |
4.1(v1.0) |
4.3(v1.0) |
11.1(v1.0) |
10.0(v2.0), 11.0(v2.1) |
12.1(v2.1) |
Yes |
Yes | ||||
static_assert |
4.1 |
4.3 |
11.0 |
10.0 |
11.1 |
Yes |
2.9 | ||||
Strongly-typed enums |
4.4 |
12.0 |
11.0 |
12.1 |
Yes |
2.9 | |||||
Template aliases |
4.7 |
12.1 |
3.0 | ||||||||
Thread-Local Storage |
4.8 (4.4****) |
11.1*** |
10.0*** |
5.9*** |
2.9**** | ||||||
Unrestricted Unions |
4.6 |
|
3.0 | ||||||||
Built-in Type Traits |
6.16 |
4.0 |
4.3 |
10.0 |
8.0 |
Yes |
3.0 | ||||
Variadic Templates |
4.1(v0.9) |
4.3(v0.9) 4.4(v1.0) |
12.1(v0.9) |
11.0 nov'12 |
11.1 (v0.9) |
2.9(1.0) | |||||
Range-based for-loop |
4.6 |
13.0 |
11.0 |
3.0 | |||||||
override and final |
4.7 |
12.0(v0.8)*** |
8.0(v0.8)*** 11.0(v1.0) |
2.9 | |||||||
Attributes |
4.8 |
12.1 |
|||||||||
ref-qualifiers |
4.8.1 |
2.9 | |||||||||
Non-static data member initializers |
4.7 |
3.0 | |||||||||
Dynamic initialization and destruction with concurrency (Magic statics) |
4.3 |
? |
2.9 |
* — 1) unicode string literals is a feature of the EDG frontend, but it is undocumented at Intel C++ compiler (/Qoption,cpp,"--uliterals" option enables it)