锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 婧愭枃绔犳潵鑷墠C++鏍囧噯濮斿憳浼氱殑 Danny Kalev 鐨?nbsp;The Biggest Changes in C++11 (and Why You Should Care)錛岃禆鍕囨旦鍋氫簡涓涓?a target="_blank">涓枃緲昏瘧鍦ㄨ繖閲?/a>銆傛墍浠ワ紝鎴戝氨涓嶇炕璇戜簡錛屾垜鍦ㄨ繖閲屼粎瀵規枃涓彁鍒扮殑榪欎簺鍙樺寲“榪介棶涓轟粈涔堣寮曞叆榪欎簺鍙樺寲”鐨勪竴涓帰璁紝鍙湁鐭ラ亾涓轟簡浠涔堬紝鐢ㄥ湪浠涔堝湴鏂癸紝鎴戜滑鎵嶈兘鐪熸瀛﹀埌榪欎釜鐭ヨ瘑銆傝屼互姝や綘鍙互鏇存繁鍏ュ湴浜嗚В榪欎簺鍙樺寲銆傛墍浠ワ紝鏈枃涓嶆槸緲昏瘧銆傚洜涓哄啓寰楁湁浜涗粨淇冿紝鎵浠ラ毦鍏嶆湁闂錛岃繕璇峰ぇ瀹舵寚姝c?/p>
Lambda琛ㄨ揪寮忔潵婧愪簬鍑芥暟寮忕紪紼嬶紝璇寸櫧灝變簡灝辨槸鍦ㄤ嬌鐢ㄧ殑鍦版柟瀹氫箟鍑芥暟錛屾湁鐨勮璦鍙?#8220;闂寘”錛屽鏋?lambda 鍑芥暟娌℃湁浼犲洖鍊?渚嬪 void )錛屽叾鍥炶繑綾誨瀷鍙瀹屽叏蹇界暐銆?瀹氫箟鍦ㄤ笌 lambda 鍑芥暟鐩稿悓浣滅敤鍩熺殑鍙橀噺鍙傝冧篃鍙互琚嬌鐢ㄣ傝繖縐嶇殑鍙橀噺闆嗗悎涓鑸縐頒綔 closure錛堥棴鍖咃級銆傛垜鍦ㄨ繖閲屽氨涓嶅啀璁茶繖涓簨浜嗐傝〃杈懼紡鐨勭畝鍗曡娉曞涓嬶紝 鍘熸枃鐨勪綔鑰呯粰鍑轟簡涓嬮潰鐨勪緥瀛愶細 鍦ㄤ紶緇熺殑STL涓璮or_each() 榪欎釜鐜╂剰鏈鍚庨偅涓弬鏁伴渶瑕佷竴涓?#8220;鍑芥暟瀵硅薄”錛屾墍璋撳嚱鏁板璞★紝鍏跺疄鏄竴涓猚lass錛岃繖涓猚lass閲嶈澆浜唎perator()錛屼簬鏄繖涓璞″彲浠ュ儚鍑芥暟鐨勫紡鏍風殑浣跨敤銆傚疄鐜頒竴涓嚱鏁板璞″茍涓嶅鏄擄紝闇瑕佷嬌鐢╰emplate錛屾瘮濡備笅闈㈣繖涓緥瀛愬氨鏄嚱鏁板璞$殑綆鍗曚緥瀛愶紙瀹為檯鐨勫疄鐜拌繙姣旇繖涓鏉傦級錛?/p>
鎵浠ワ紝C++寮曞叆Lambda鐨勬渶涓昏鍘熷洜灝辨槸1錛夊彲浠ュ畾涔夊尶鍚嶅嚱鏁幫紝2錛夌紪璇戝櫒浼氭妸鍏惰漿鎴愬嚱鏁板璞?/strong>銆傜浉淇′綘浼氬拰鎴戜竴鏍鳳紝浼氱枒闂負浠涔堜互鍓峉TL涓殑ptr_fun()榪欎釜鍑芥暟瀵硅薄涓嶈兘鐢紵錛坧tr_fun()灝辨槸鎶婁竴涓嚜鐒跺嚱鏁拌漿鎴愬嚱鏁板璞$殑錛夈傚師鍥犳槸錛宲tr_fun() 鐨勫眬闄愭槸鍏舵帴鏀剁殑鑷劧鍑芥暟鍙兘鏈?鎴?涓弬鏁般?/p>
閭d箞錛岄櫎浜嗘柟渚垮錛屼負浠涔堜竴瀹氳浣跨敤Lambda鍛紵瀹冩瘮浼犵粺鐨勫嚱鏁版垨鏄嚱鏁板璞℃湁浠涔堝ソ澶勫憿錛熸垜涓漢鎵鐞嗚В鐨勬槸錛岃繖縐嶅嚱鏁頒箣騫翠互鍙?#8220;闂寘”錛屽氨鏄洜涓哄叾闄愬埗浜嗗埆浜虹殑璁塊棶錛屾洿縐佹湁銆備篃鍙互璁や負浠栨槸涓嬈℃х殑鏂規硶銆侺ambda琛ㄨ揪寮忓簲璇ユ槸綆媧佺殑錛屾瀬縐佹湁鐨勶紝涓轟簡鏇存槗鐨勪唬鐮佸拰鏇存柟渚跨殑緙栫▼銆?/p>
鍦ㄨ繖涓鑺備腑錛屽師鏂囦富瑕佷粙緇嶄簡涓や釜鍏抽敭瀛?auto 鍜?deltype錛岀ず渚嬪涓嬶細 auto 鏈澶х殑濂藉灝辨槸璁╀唬鐮佺畝媧侊紝灝ゅ叾鏄偅浜涙ā鏉跨被鐨勫0鏄庯紝姣斿錛歋TL涓殑瀹瑰櫒鐨勮凱浠e瓙綾誨瀷銆?/p>
鍙互鍙樻垚錛?/p>
妯℃澘榪欎釜鐗規цC++鐨勪唬鐮佸彉寰楀緢闅捐錛屼笉淇′綘鍙互鐪嬬湅STL鐨勬簮鐮侊紝閭f槸涓涓貢鍟娿備嬌鐢╝uto蹇呴渶涓涓垵濮嬪寲鍊鹼紝緙栬瘧鍣ㄥ彲浠ラ氳繃榪欎釜鍒濆鍖栧兼帹瀵煎嚭綾誨瀷銆傚洜涓篴uto鏄潵綆鍖栨ā鏉跨被寮曞叆鐨勪唬鐮侀毦璇葷殑闂錛屽涓婇潰鐨勭ず渚嬶紝iteration榪欑綾誨瀷灝辨渶閫傚悎鐢╝uto鐨勶紝浣嗘槸錛屾垜浠笉搴旇鎶婂叾婊ョ敤銆?/p>
姣斿涓嬮潰鐨勪唬鐮佺殑鍙鎬у氨闄嶄綆浜嗐傚洜涓猴紝鎴戜笉鐭ラ亾ProcessData榪斿洖浠涔堬紵int? bool? 榪樻槸瀵硅薄錛熸垨鏄埆鐨勪粈涔堬紵榪欒浣犲悗闈㈢殑紼嬪簭涓嶇煡閬撴庝箞鍋氥?/p>
浣嗘槸涓嬮潰鐨勭▼搴忓氨娌℃湁闂錛屽洜涓簆Object鐨勫瀷鍒湪鍚庨潰鐨刵ew涓湁浜嗐?/p>
鍏充簬 鍘熸枃緇欏嚭鐨勭ず渚嬪涓嬶紝鎴戜滑鍙互鐪嬪埌錛岃繖涓鐨勭‘鎴戜滑鐨勫畾涔夊彉閲忕渷浜嗗緢澶氫簨銆?/p>
榪樻湁涓涓傚悎鐨勭敤娉曟槸鐢ㄦ潵typedef鍑芥暟鎸囬拡錛屼篃浼氱渷寰堝浜嬨傛瘮濡傦細 Wikipedia 涓婃槸榪欎箞璇寸殑錛堝叧浜巇ecltype鐨勮鍒欒涓婏級 濡傛灉auto 鍜?decltype 鍦ㄤ竴璧蜂嬌鐢ㄤ細鏄粈涔堟牱瀛愶紵鑳界湅涓嬮潰鐨勭ず渚嬶紝涓嬮潰榪欎釜紺轟緥涔熸槸寮曞叆decltype鐨勪竴涓師鍥?#8212;—璁〤++鏈夎兘鍔涘啓涓涓?“ forwarding function 妯℃澘”錛?/p>
榪欎釜鍑芥暟妯℃澘鐪嬭搗鏉ョ浉褰撹垂瑙o紝鍏剁敤鍒頒簡auto 鍜?decltype 鏉ユ墿灞曚簡宸叉湁鐨勬ā鏉挎妧鏈殑涓嶈凍銆傛庝箞涓笉瓚沖憿錛熷湪涓婁緥涓紝鎴戜笉鐭ラ亾AddingFunc浼氭帴鏀朵粈涔堟牱綾誨瀷鐨勫璞★紝榪欎袱涓璞$殑 + 鎿嶄綔絎﹁繑鍥炵殑綾誨瀷涔熶笉鐭ラ亾錛岃佺殑妯℃澘鍑芥暟鏃犳硶瀹氫箟AddingFunc榪斿洖鍊煎拰榪欎袱涓璞$浉鍔犲悗鐨勮繑鍥炲煎尮閰嶏紝鎵浠ワ紝浣犲彲浠ヤ嬌鐢ㄤ笂榪扮殑榪欑瀹氫箟銆?/p>
C/C++鐨勫垵濮嬪寲鐨勬柟娉曟瘮杈冿紝C++ 11 鐢ㄥぇ鎷彿緇熶竴浜嗚繖浜涘垵濮嬪寲鐨勬柟娉曘?/p>
姣斿錛歅OD鐨勭被鍨嬨?/p>
鍏充簬POD鐩歌涓ゅ彞錛屾墍璋揚OD灝辨槸Plain Old Data錛屽綋class/struct鏄?em>鏋佺畝鐨?trivial)銆佸睘浜?em>鏍囧噯甯冨眬(standard-layout)錛屼互鍙婁粬鐨勬墍鏈夐潪闈欐侊紙non-static錛夋垚鍛橀兘鏄疨OD鏃訛紝浼氳瑙嗕負POD銆傚錛?/p>
POD鐨勫垵濮嬪寲鏈夌偣鎬紝姣斿涓婁緥錛宯ew A; 鍜宯ew A(); 鏄笉涓鏍風殑錛屽浜庡叾鍐呴儴鐨刴錛屽墠鑰呮病鏈夎鍒濆鍖栵紝鍚庤呰鍒濆鍖栦簡錛堜笉鍚?鐨勭紪璇戝櫒琛屼負涓嶄竴鏍鳳紝VC++鍜孏CC涓嶄竴鏍鳳級銆傝岄潪POD鐨勫垵濮嬪寲錛屽垯閮戒細琚垵濮嬪寲銆?/p>
浠庤繖鐐瑰彲浠ョ湅鍑猴紝C/C++鐨勫垵濮嬪寲闂寰堝鎬紝鎵浠ワ紝鍦–++ 2011鐗堜腑灝卞仛浜嗙粺涓銆傚師鏂囦綔鑰呯粰鍑轟簡濡備笅鐨勭ず渚嬶細 瀹瑰櫒鐨勫垵濮嬪寲錛?/p>
榪樻敮鎸佸儚Java涓鏍風殑鎴愬憳鍒濆鍖栵細 鎴戜滑鐭ラ亾C++鐨勭紪璇戝櫒鍦ㄤ綘娌℃湁瀹氫箟鏌愪簺鎴愬憳鍑芥暟鐨勬椂鍊欎細緇欎綘鐨勭被鑷姩鐢熸垚榪欎簺鍑芥暟錛屾瘮濡傦紝鏋勯犲嚱鏁幫紝鎷瘋礉鏋勯狅紝鏋愭瀯鍑芥暟錛岃祴鍊煎嚱鏁般傛湁浜涙椂鍊欙紝鎴戜滑涓嶆兂瑕佽繖浜涘嚱鏁幫紝姣斿錛屾瀯閫犲嚱鏁幫紝鍥犱負鎴戜滑鎯沖仛瀹炵幇鍗曚緥妯″紡銆備紶緇熺殑鍋氭硶鏄皢鍏跺0鏄庢垚private綾誨瀷銆?/p>
鍦ㄦ柊鐨凜++涓紩鍏ヤ簡涓や釜鎸囩ず絎︼紝delete鎰忎負鍛婅瘔緙栬瘧鍣ㄤ笉鑷姩浜х敓榪欎釜鍑芥暟錛宒efault鍛婅瘔緙栬瘧鍣ㄤ駭鐢熶竴涓粯璁ょ殑銆傚師鏂囩粰鍑轟簡涓嬮潰涓や釜渚嬪瓙錛?/p>
鍐嶅delete 榪欓噷錛屾垜鎯寵涓涓嬶紝涓轟粈涔堟垜浠渶瑕乨efault錛熸垜浠涔堥兘涓嶅啓涓嶅氨鏄痙efault鍚楋紵涓嶅叏鐒舵槸錛屾瘮濡傛瀯閫犲嚱鏁幫紝鍥犱負鍙浣犲畾涔変簡涓涓瀯閫犲嚱鏁幫紝緙栬瘧鍣ㄥ氨涓嶄細緇欎綘鐢熸垚涓涓粯璁ょ殑浜嗐傛墍浠ワ紝涓轟簡瑕佽榛樿鐨勫拰鑷畾涔夌殑鍏卞瓨錛屾墠寮曞叆榪欎釜鍙傛暟錛屽涓嬩緥鎵紺猴細 鍏充簬delete榪樻湁涓や釜鏈夌敤鐨勫湴鏂規槸 1錛夎浣犵殑瀵硅薄鍙兘鐢熸垚鍦ㄦ爤鍐呭瓨涓婏細 2錛夐樆姝㈠嚱鏁扮殑鍏跺艦鍙傜殑綾誨瀷璋冪敤錛氾紙鑻ュ皾璇曚互 double 鐨勫艦鍙傝皟鐢?nbsp; C/C++鐨凬ULL瀹忔槸涓鏈夊緢澶氭綔鍦˙UG鐨勫畯銆傚洜涓烘湁鐨勫簱鎶婂叾瀹氫箟鎴愭暣鏁?錛屾湁鐨勫畾涔夋垚 (void*)0銆傚湪C鐨勬椂浠h繕濂姐備絾鏄湪C++鐨勬椂浠o紝榪欏氨浼氬紩鍙戝緢澶氶棶棰樸備綘鍙互涓婄綉鐪嬬湅銆傝繖鏄負浠涔堥渶瑕?nbsp; 鍦ㄤ互鍓嶇殑C++涓紝鏋勯犲嚱鏁頒箣闂翠笉鑳戒簰鐩歌皟鐢紝鎵浠ワ紝鎴戜滑鍦ㄥ啓榪欎簺鐩鎬技鐨勬瀯閫犲嚱鏁伴噷錛屾垜浠細鎶婄浉鍚岀殑浠g爜鏀懼埌涓涓鏈夌殑鎴愬憳鍑芥暟涓?/p>
浣嗘槸錛屼負浜嗘柟渚垮茍涓嶈凍璁?#8220;濮旀墭鏋勯?#8221;榪欎釜浜嬪嚭鐜幫紝鏈涓昏鐨勯棶棰樻槸錛屽熀綾葷殑鏋勯犱笉鑳界洿鎺ユ垚涓烘淳鐢熺被鐨勬瀯閫狅紝灝辯畻鏄熀綾葷殑鏋勯犲嚱鏁板浜嗭紝媧劇敓綾昏繕瑕佽嚜宸卞啓鑷繁鐨勬瀯閫犲嚱鏁幫細 涓婁緥涓紝媧劇敓綾繪墜鍔ㄧ戶鎵垮熀綾葷殑鏋勯犲嚱鏁幫紝 緙栬瘧鍣ㄥ彲浠ヤ嬌鐢ㄥ熀綾葷殑鏋勯犲嚱鏁板畬鎴愭淳鐢熺被鐨勬瀯閫犮?鑰屽皢鍩虹被鐨勬瀯閫犲嚱鏁板甫鍏ユ淳鐢熺被鐨勫姩浣?鏃犳硶閫夋嫨鎬у湴閮ㄥ垎甯﹀叆錛?鎵浠ワ紝瑕佷笉灝辨槸緇ф壙鍩虹被鍏ㄩ儴鐨勬瀯閫犲嚱鏁幫紝瑕佷笉灝辨槸涓涓兘涓嶇戶鎵?涓嶆墜鍔ㄥ甫鍏?銆?姝ゅ錛岃嫢鐗墊秹鍒板閲嶇戶鎵匡紝浠庡涓熀綾葷戶鎵胯屾潵鐨勬瀯閫犲嚱鏁頒笉鍙互鏈夌浉鍚岀殑鍑芥暟絳懼悕(signature)銆?鑰屾淳鐢熺被鐨勬柊鍔犲叆鐨勬瀯閫犲嚱鏁頒篃涓嶅彲浠ュ拰緇ф壙鑰屾潵鐨勫熀綾繪瀯閫犲嚱鏁版湁鐩稿悓鐨勫嚱鏁扮鍚嶏紝鍥犱負榪欑浉褰撲簬閲嶅澹版槑銆傦紙鎵璋撳嚱鏁扮鍚嶅氨鏄嚱鏁扮殑鍙傛暟綾誨瀷鍜岄『搴忎笉錛?/p>
鍦ㄨ佺増鐨凜++涓紝涓存椂鎬у彉閲忥紙縐頒負鍙沖?#8221;R-values”錛屼綅浜庤祴鍊兼搷浣滅涔嬪彸錛夌粡甯哥敤浣滀氦鎹袱涓彉閲忋傛瘮濡備笅闈㈢殑紺轟緥涓殑tmp鍙橀噺銆傜ず渚嬩腑鐨勯偅涓嚱鏁伴渶瑕佷紶閫掍袱涓猻tring鐨勫紩鐢紝浣嗘槸鍦ㄤ氦鎹㈢殑榪囩▼涓駭鐢熶簡瀵硅薄鐨勬瀯閫狅紝鍐呭瓨鐨勫垎閰嶈繕鏈夊璞$殑鎷瘋礉鏋勯犵瓑絳夊姩浣滐紝鎴愭湰姣旇緝楂樸?/p>
C++ 11澧炲姞涓涓柊鐨勫紩鐢紙reference錛夌被鍨嬬О浣滃彸鍊煎紩鐢紙R-value reference錛夛紝鏍囪涓?tt>typename &&銆備粬浠兘澶熶互non-const鍊肩殑鏂瑰紡浼犲叆錛屽厑璁稿璞″幓鏀瑰姩浠栦滑銆傝繖欏逛慨姝e厑璁哥壒瀹氬璞″垱閫犲嚭move璇箟銆?/p>
涓句緥鑰岃█錛屼笂闈㈤偅涓緥瀛愪腑錛宻tring綾諱腑淇濆瓨浜嗕竴涓姩鎬佸唴瀛樺垎瀛樼殑char*鎸囬拡錛屽鏋滀竴涓猻tring瀵硅薄鍙戠敓鎷瘋礉鏋勯狅紙濡傦細鍑芥暟榪斿洖錛夛紝string綾婚噷鐨刢har*鍐呭瓨鍙兘閫氳繃鍒涘緩涓涓柊鐨勪復鏃跺璞★紝騫舵妸鍑芥暟鍐呯殑瀵硅薄鐨勫唴瀛榗opy鍒拌繖涓柊鐨勫璞′腑錛岀劧鍚庨攢姣佷復鏃跺璞″強鍏跺唴瀛樸?strong>榪欐槸鍘熸潵C++鎬ц兘涓婇噸鐐硅鎵硅瘎鐨勪簨 鑳借繃鍙沖煎紩鐢紝string鐨勬瀯閫犲嚱鏁伴渶瑕佹敼鎴?#8220;move鏋勯犲嚱鏁?#8221;錛屽涓嬫墍紺恒傝繖鏍蜂竴鏉ワ紝浣垮緱瀵規煇涓?span style="font-family: monospace">stirng鐨勫彸鍊煎紩鐢ㄥ彲浠ュ崟綰湴浠庡彸鍊煎鍒跺叾鍐呴儴C-style鐨勬寚閽堝埌鏂扮殑string錛岀劧鍚庣暀涓嬬┖鐨勫彸鍊箋傝繖涓搷浣滀笉闇瑕佸唴瀛樻暟緇勭殑澶嶅埗錛岃屼笖絀虹殑鏆傛椂瀵硅薄鐨勬瀽鏋勪篃涓嶄細閲婃斁鍐呭瓨銆傚叾鏇存湁鏁堢巼銆?/p>
The C++11 STL涓箍娉涘湴浣跨敤浜嗗彸鍊煎紩鐢ㄥ拰move璇銆傚洜姝わ紝寰堝綆楁硶鍜屽鍣ㄧ殑鎬ц兘閮借浼樺寲浜嗐?/p>
C++ STL搴撳湪2003騫寸粡鍘嗕簡寰堝ぇ鐨勬暣瀹規墜鏈?nbsp;Library Technical Report 1 (TR1)銆?TR1 涓嚭鐜頒簡寰堝鏂扮殑瀹瑰櫒綾?( 榪欎滑灝變笉澶氳浜嗭紝浠ュ墠鐨凷TL楗卞彈綰跨▼瀹夊叏鐨勬壒璇勩傜幇鍦ㄥソ 浜嗐侰++ 11 鏀寔綰跨▼綾諱簡銆傝繖灝嗘秹鍙婁袱涓儴鍒嗭細絎竴銆佽璁′竴涓彲浠ヤ嬌澶氫釜綰跨▼鍦ㄤ竴涓繘紼嬩腑鍏卞瓨鐨勫唴瀛樻ā鍨嬶紱絎簩銆佷負綰跨▼涔嬮棿鐨勪氦浜掓彁渚涙敮鎸併傜浜岄儴鍒嗗皢鐢辯▼搴忓簱鎻愪緵鏀寔銆傚ぇ瀹跺彲浠ョ湅鐪?a target="_blank">promises and futures錛屽叾鐢ㄤ簬瀵硅薄鐨勫悓姝ャ?nbsp;async() 鍑芥暟妯℃澘鐢ㄤ簬鍙戣搗騫跺彂浠誨姟錛岃?nbsp;thread_local 涓虹嚎紼嬪唴鐨勬暟鎹寚瀹氬瓨鍌ㄧ被鍨嬨傛洿澶氱殑涓滆タ錛屽彲浠ユ煡鐪?Anthony Williams鐨?nbsp;Simpler Multithreading in C++0x. C++98 鐨勭煡鑳芥寚閽堟槸 涓轟粈涔堣榪欎箞騫詫紵澶у鍙互鐪嬬湅銆奙ore Effective C++銆嬩腑瀵?auto_ptr鐨勮璁恒?/p>
瀹氫箟浜嗕竴浜涙柊鐨勭畻娉曪細 浣跨敤鏂扮殑copy_n()綆楁硶錛屼綘鍙互寰堟柟渚垮湴鎷瘋礉鏁扮粍銆?/p>
浣跨敤 鎬諱箣錛岀湅涓嬫潵錛孋++11 榪樻槸寰堝闄㈡淳錛屽緢澶氬疄鐢ㄧ殑涓滆タ榪樻槸娌℃湁錛屾瘮濡傦細 XML錛宻ockets錛宺eflection錛屽綋鐒惰繕鏈夊瀮鍦懼洖鏀躲傜湅鏉ヨ絳夊埌C++ 20浜嗐傚懙鍛點備笉榪嘋++ 11鍦ㄦц兘涓婅繕鏄緢蹇傚弬鐪?Google’s benchmark tests銆傚師鏂囪繕寮曠敤Stroustrup 鐨勮鐐癸細C++11 鏄竴闂ㄦ柊鐨勮璦——涓涓洿濂界殑 C++銆?/p>
濡傛灉鎶婃墍鏈夌殑鏀瑰彉閮藉垪鍑烘潵錛屼綘浼氬彂鐜扮湡澶氬晩銆傛垜浼拌C++ Primer閭f湰涔︾殑鍘氬害瑕佸鍔犺嚦灝?0%浠ヤ笂銆侰++鐨勯棬妲涗細涓嶄細瓚婃潵瓚婇珮浜嗗憿錛熸垜涓嶇煡閬擄紝浣嗘垜涓漢瑙夊緱榪欓棬璇█鐨勭‘鏄彉寰楄秺鏉ヨ秺浠や漢鏈涜屽嵈姝ヤ簡銆傦紙鎯寵搗浜嗘煇浜哄拰鎴戣鐨勪竴鍙ヨ瘽——瀛︽妧鏈湡鐨勬槸澶瘡浜嗭紝榪樻槸鎼炴柟娉曡濂芥販浜涳紵錛?/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) Lambda 琛ㄨ揪寮?/h4>
[capture](parameters)->return_type {body}
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;}
template <class T>class less{public: bool operator()(const T&l, const T&r)const { return l < r; }};鑷姩綾誨瀷鎺ㄥ auto
auto x=0; //x has type int because 0 is intauto c='a'; //charauto d=0.5; //doubleauto 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 鏄竴涓搷浣滅錛屽叾鍙互璇勪及鎷彿鍐呰〃杈懼紡鐨勭被鍨嬶紝鍏惰鍒欏涓嬶細
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&, 鍥犱負鍑芥暟鐨勮繑鍥炵被鍨嬫槸 // std::vector<int>::operator[](size_type) const auto c = 0; // c 鐨勭被鍨嬫槸 int auto d = c; // d 鐨勭被鍨嬫槸 int decltype(c) e; // e 鐨勭被鍨嬫槸 int, 鍥犱負 c 鐨勭被鍨嬫槸int decltype((c)) f = c; // f 鐨勭被鍨嬫槸 int&, 鍥犱負 (c) 鏄乏鍊?/code> decltype(0) g; // g 鐨勭被鍨嬫槸 int, 鍥犱負 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; }; // PODstruct B { ~B(); int m; }; // non-POD, compiler generated default ctorstruct 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 onlyclass X { int a[4]; public: X() : a{1,2,3,4} {} //C++11, member array initializer};
// C++11 container initializervector<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()錛屽皢浼氬紩鍙戠紪璇戞湡閿欒錛?緙栬瘧鍣ㄤ笉浼氳嚜鍔ㄥ皢 double 褰㈠弬杞瀷涓?int 鍐嶈皟鐢?code>f()錛屽鏋滀紶鍏ョ殑鍙傛暟鏄痙ouble錛屽垯浼氬嚭鐜扮紪璇戦敊璇級
void f(int i); void f(double) = delete;nullptr
nullptr 鐨勫師鍥犮?nbsp;nullptr 鏄己綾誨瀷鐨勩?/p>
void f(int); //#1void f(char *);//#2//C++03f(0); //浜屼箟鎬?/code>//C++11f(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;}
class string{ string (string&&); //move constructor string&& operator=(string&&); //move assignment operator};C++ 11 STL 鏍囧噯搴?/h4>
unordered_set, unordered_map, unordered_multiset, 鍜?nbsp;unordered_multimap) 浠ュ強涓浜涙柊鐨勫簱鏀寔璇稿錛氭鍒欒〃杈懼紡錛?tuples錛屽嚱鏁板璞″寘瑁咃紝絳夌瓑銆?C++11 鎵瑰噯浜?TR1 鎴愪負姝e紡鐨凜++鏍囧噯錛岃繕鏈変竴浜汿R1 鍚庢柊鍔犵殑涓浜涘簱錛屼粠鑰屾垚涓轟簡鏂扮殑C++ 11 STL鏍囧噯搴撱傝繖涓簱涓昏鍖呭惈涓嬮潰鐨勫姛鑳斤細綰跨▼搴?/h5>
鏂板瀷鏅鴻兘鎸囬拡
auto_ptr錛?鍦–++ 11涓搴熷純浜嗐?/code>C++11 寮曞叆浜嗕袱涓寚閽堢被錛?nbsp;shared_ptr 鍜?unique_ptr銆?shared_ptr鍙槸鍗曠函鐨勫紩鐢ㄨ鏁版寚閽堬紝銆?nbsp;unique_ptr 鏄敤鏉ュ彇浠?code>auto_ptrunique_ptr 鎻愪緵 auto_ptr 澶ч儴浠界壒鎬э紝鍞竴鐨勪緥澶栨槸 auto_ptr 鐨勪笉瀹夊叏銆侀殣鎬х殑宸﹀兼惉縐匯備笉鍍?nbsp;auto_ptr錛?code>unique_ptr 鍙互瀛樻斁鍦?C++0x 鎻愬嚭鐨勯偅浜涜兘瀵熻鎼Щ鍔ㄤ綔鐨勫鍣ㄤ箣涓?/p>
鏂扮殑綆楁硶
all_of(), any_of() 鍜?nbsp;none_of()銆?/code>
#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
#include <algorithm>int source[5]={0,12,34,50,80};int target[5];//copy 5 elements from source to targetcopy_n(source,5,target);iota() 鍙互鐢ㄦ潵鍒涘緩閫掑鐨勬暟鍒椼傚涓嬩緥鎵紺猴細
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'}
The following table lists C++0x features and their support in popular compilers.
12.0(v1.0)
4.5(v2.1)
4.6(v3.0)
12.0(v2.0)
]]>