锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
緗楁湞杈?(http://m.shnenglu.com/kesalin/)
.\n");
.\n");
.\n");鍦?VS2010 涓紪璇戣繍琛屾槸娌℃湁闂鐨勶紝浣嗗湪 gcc 4.7.3涓嬶紝緙栬瘧閮介氫笉榪囷細
涓轟簡杈懼埌榪戜技鎴愬憳鍑芥暟妯℃澘鐗瑰寲鐨勬晥鏋滐紝鍙互鍒╃敤鎴愬憳鍑芥暟涓繪ā鏉夸互鍙婇噸杞藉嚱鏁版潵瀹炵幇錛?br />
.\n");
.\n");
.\n");
璋冪敤 DoTest() 榪愯緇撴灉濡備笅錛?/p>
.
.
.
.
娉ㄦ剰錛?/span>
VS2010 鐗堟湰鐨勪唬鐮侊紝妯℃澘褰㈠弬涓?T錛屽湪瀹炰緥鍖栦笉浼氳繘琛岄殣寮忕被鍨嬭漿鎹€傚嵆鐢?nbsp;Derived * 褰撲綔瀹炲弬璋冪敤鐨勬槸涓繪ā鏉匡紝鑰屼笉鏄?Base * 鐗瑰寲鐗堟湰
鑰屽湪 gcc 涓嬶紝妯℃澘褰㈠弬铏界劧涔熶負T錛屼絾褰卞搷閲嶈澆鍐寵鐨?function 鍙傛暟涓猴細DummyIdentity<T>錛岀敤涓嶅悓鐨勫疄闄呭弬鏁板疄渚嬪寲璇ユā鏉匡紝寰楀埌鐨勬槸涓鍫嗛噸杞藉嚱鏁般傚洜姝ょ敤 Derived * 褰撲綔瀹炲弬鏃訛紝璋冪敤鐨勫嚱鏁拌嚜鐒跺氨鏄疄渚嬪寲鐨?nbsp;void function(DummyIdentity<T>)浜嗐?/p>
銆愯瘧銆慥C10涓殑C++0x鐗規?Part 2 錛?錛夛細鍙沖煎紩鐢?/span>
鏉ユ簮錛?a title=vcvlog target=_blank>vcblog 浣滆咃細Stephan T. Lavavej 緲昏瘧錛?a title=椋橀鐧戒簯鐨凜++鍗氬 href="http://m.shnenglu.com/kesalin" target=_blank>椋橀鐧戒簯
(杞澆鏃惰娉ㄦ槑浣滆呭拰鍑哄銆傛湭緇忚鍙紝璇峰嬁鐢ㄤ簬鍟嗕笟鐢ㄩ?
綆浠?
榪欎竴緋誨垪鏂囩珷浠嬬粛Microsoft Visual Studio 2010 涓敮鎸佺殑C++ 0x鐗規э紝鐩墠鏈変笁閮ㄥ垎銆?
Part 1 錛氫粙緇嶄簡Lambdas錛?璧嬩簣鏂版剰涔夌殑auto錛屼互鍙?static_assert錛?
Part 2( 涓 , 浜?/a> , 涓?/a> )錛氫粙緇嶄簡鍙沖煎紩鐢紙Rvalue References錛夛紱
Part 3錛氫粙緇嶄簡琛ㄨ揪寮忕被鍨嬶紙decltype錛?br>
VC10涓殑C++0x鐗規?Part 1,2,3 璇戞枃鎵撳寘涓嬭澆錛坉oc 鍜?pdf 鏍煎紡錛夛細 鐐規涓嬭澆
杞彂闂
鍦ㄧ▼搴忓憳涓嶇敤鍐欓珮搴︽硾鍖栫殑浠g爜鐨勬椂鍊欙紝C++98/03 鐨?lvalue錛?rvalue錛?寮曠敤錛岃繕鏈夋ā鏉跨湅璧鋒潵鏄緢瀹岀編鐨勩傚亣璁句綘瑕佸啓涓涓畬鍏ㄦ硾鍖栫殑鍑芥暟 outer()錛岃繖涓嚱鏁扮殑鐩殑鏄皢浠繪剰鏁扮洰涓換鎰忕被鍨嬬殑鍙傛暟浼犻掞紙涔熷氨鏄?#8220;杞彂”錛夌粰鍑芥暟 inner()銆傚凡鏈夊緢澶氫笉閿欑殑瑙e喅鏂規錛屾瘮濡?factory 鍑芥暟 make_shared<T>(args) 鏄妸 args 浼犵粰 T 鐨勬瀯閫犲嚱鏁幫紝鐒跺悗榪斿洖 shared_ptr<T>銆傦紙榪欐牱灝辨妸 T 瀵硅薄鍜岀敤浜庡瀹冭繘琛屽紩鐢ㄨ鏁扮殑浠g爜瀛樺偍鍒板悓涓鍧楀姩鎬佸唴瀛樹腑錛屾ц兘涓婁笌渚靛叆寮忓紩鐢ㄨ鏁頒竴鏍峰ソ錛夛紱 鑰屽儚 function<Ret(args)> 榪欐牱鐨勫寘瑁呯被鏄妸鍙傛暟浼犵粰鍏跺唴閮ㄥ瓨鍌ㄧ殑鍑芥暟瀵硅薄錛坒unctor錛夛紝絳夌瓑銆傚湪榪欑瘒鏂囩珷閲岋紝鎴戜滑鍙 outer() 鏄浣曟妸鍙傛暟浼犻掔粰 inner() 榪欓儴鍒嗘劅鍏磋叮銆傝嚦浜?outer() 鐨勮繑鍥炵被鍨嬫槸鎬庝箞鍐沖畾鐨勬槸鍙﹀鐨勯棶棰橈紙鏈夋椂鍊欏緢綆鍗曪紝濡?make_shared<T>(args) 鎬繪槸榪斿洖 shared_prt<T>錛岋級錛屼絾瑕佸湪瀹屽叏鎼炲畾榪欎釜闂鐨勪竴鑸寲鎯呭喌錛屼綘灝辮鐢ㄥ埌 C++0x鐨?decltype 鐗規т簡錛夈?/p>
濡傛灉涓嶅甫鍙傛暟錛屽氨涓嶅瓨鍦ㄨ繖鏍風殑闂錛岄偅涔堝甫涓涓弬鏁版儏鍐靛憿錛熻鎴戜滑灝濊瘯鍐欎釜 outer錛堬級 錛?/p>
template <typename T> void outer(T& t) {
inner(t);
}
闂?棰樻潵浜嗭紝濡傛灉浼犵粰瀹冪殑鍙傛暟鏄潪甯擱噺 rvalue錛岄偅鎴戜滑灝辨棤娉曡皟鐢?outer()銆傚鏋?inner() 鎺ユ敹 const int& 鍨嬬殑鍙傛暟錛岄偅 inner(5) 鏄彲浠ラ氳繃緙栬瘧鐨勶紝浣嗘槸 outer(5) 灝辯紪璇戜笉榪囦簡銆傚洜涓?T 浼氳鎺ㄥ涓?int錛?鑰?int& 鏄笉鑳界粦瀹氬埌甯擱噺 5 鐨勩?/p>
濂藉惂錛岃鎴戜滑璇曡瘯榪欎釜錛?/p>
template <typename T> void outer(const T& t) {
inner(t);
}
濡傛灉 inner錛堬級鎺ユ敹 int& 鍨嬪弬鏁幫紝閭e氨浼氳繚娉?const 姝g‘鎬э紝緙栬瘧閮借繃涓嶄簡銆?/p>
鐜板湪錛屼綘鍙互閲嶈澆涓や釜鍒嗗埆甯?T& 鍜?const T& 鍙傛暟鐨?outer錛堬級錛岃繖紜疄綆$敤銆傚綋浣犺皟鐢?outer錛堬級鏃訛紝灝卞儚鐩存帴璋冪敤 inner錛堬級 涓鏍楓?/p>
鍙儨鐨勬槸錛岃繖涓柟娉曞湪澶氬弬鏁扮殑鎯呭喌涓嬪氨楹葷儲浜嗭紙璇戞敞錛氳鍐欑殑閲嶈澆鍑芥暟澶浜嗭級銆備綘灝卞緱涓烘瘡涓涓弬鏁板儚 T1& 鍜?const T1&, T2& 鍜?const T2& 絳夎繖鏍瘋繘琛岄噸杞斤紝瑕侀噸杞界殑鍑芥暟鏁扮洰鍛堟寚鏁扮駭澧為暱銆傦紙VC9 SP1 鐨?tr1錛氾細bind() 灝卞璁╀漢鎰熷埌緇濇湜浜嗭紝瀹冧負 5 涓弬鏁拌繖涔堥噸杞藉嚭浜?63 涓嚱鏁般傚鏋滀笉榪欎箞铔共鐨勮瘽錛屾病鏈夊儚榪欓噷鐨勯暱綃囩瘡榪幫紝鎴戜滑灝卞緢闅捐窡浣跨敤鑰呰В閲婁負浠涔堜笉鑳借皟鐢ㄧ敤 1729 榪欐牱鐨?ravlue 鍋氬弬鏁扮殑鍑芥暟銆備負浜嗕駭鐢熷嚭榪欎簺閲嶈澆鍑芥暟浣跨敤浜嗕護浜轟綔鍛曠殑棰勫鐞嗘満鍒訛紝鎭跺績鍒頒綘閮戒笉鎯崇煡閬撳畠錛夈?/p>
鍦?C++98/03 涓紝杞彂闂鏄緢涓ラ噸鐨勶紝鑰屼笖鏈川涓婃棤瑙o紙蹇呴』姹傚姪浜庢伓蹇冪殑棰勫鐞嗘満鍒訛紝榪欎細涓ラ噸鎷栨參緙栬瘧閫熷害錛岃繕璁╀唬鐮佸彉寰楅毦浠ラ槄璇伙級銆傛葷畻錛?rvalue 浼橀泤鍦拌В鍐充簡榪欎釜闂銆?/p>
瀹岀編杞彂錛?/strong> 妯″紡
瀹岀編杞彂璁╀綘鑳界畝鍗曡屾竻鏅板湴鍙啓涓涓ā鏉垮嚱鏁板氨鍙互杞彂鎵鏈夌殑鍙傛暟緇欎換鎰忓嚱鏁幫紝涓嶇瀹冨甫鍑犱釜鍙傛暟錛屼篃涓嶇鍙傛暟綾誨瀷鏄粈涔堛傝屼笖鍙傛暟鐨勯潪甯擱噺/甯擱噺錛?lvalue/rvalue 灞炴ч兘鑳藉緱浠ヤ繚鐣欙紝璁╀綘鍙互鍍忎嬌鐢?inner錛堬級 涓鏍蜂嬌鐢?outer錛堬級錛岃繕鍙互鍜?move 璇剰涓璧風敤浠庤岃幏寰楅澶栫殑濂藉銆傦紙 C++0x 鐨勫彉闀挎ā鏉挎妧鏈В鍐充簡“浠繪剰鏁扮洰”榪欓儴鍒嗭紝鎴戜滑鍦ㄨ繖閲屾妸 N 鐪嬪仛浠繪剰鏁扮洰錛夈備箥鐪嬩箣涓嬪緢紲炲錛屽疄闄呬笂寰堢畝鍗曪細
C:\Temp>type perfect.cpp
#include <iostream>
#include <ostream>
using namespace std;
template <typename T> struct Identity {
typedef T type;
};
template <typename T> T&& Forward(typename Identity<T>::type&& t) {
return t;
}
void inner(int&, int&) {
cout << "inner(int&, int&)" << endl;
}
void inner(int&, const int&) {
cout << "inner(int&, const int&)" << endl;
}
void inner(const int&, int&) {
cout << "inner(const int&, int&)" << endl;
}
void inner(const int&, const int&) {
cout << "inner(const int&, const int&)" << endl;
}
template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) {
inner(Forward<T1>(t1), Forward<T2>(t2));
}
int main() {
int a = 1;
const int b = 2;
cout << "Directly calling inner()." << endl;
inner(a, a);
inner(b, b);
inner(3, 3);
inner(a, b);
inner(b, a);
inner(a, 3);
inner(3, a);
inner(b, 3);
inner(3, b);
cout << endl << "Calling outer()." << endl;
outer(a, a);
outer(b, b);
outer(3, 3);
outer(a, b);
outer(b, a);
outer(a, 3);
outer(3, a);
outer(b, 3);
outer(3, b);
}
C:\Temp>cl /EHsc /nologo /W4 perfect.cpp
perfect.cpp
C:\Temp>perfect
Directly calling inner().
inner(int&, int&)
inner(const int&, const int&)
inner(const int&, const int&)
inner(int&, const int&)
inner(const int&, int&)
inner(int&, const int&)
inner(const int&, int&)
inner(const int&, const int&)
inner(const int&, const int&)
Calling outer().
inner(int&, int&)
inner(const int&, const int&)
inner(const int&, const int&)
inner(int&, const int&)
inner(const int&, int&)
inner(int&, const int&)
inner(const int&, int&)
inner(const int&, const int&)
inner(const int&, const int&)
涓よ錛佸畬緹庤漿鍙戝彧鐢ㄤ簡涓よ錛佸綆媧佸惂錛?/p>
榪欎釜渚嬪瓙紺鴻寖浜嗘庝箞鎶?t1 鍜?t2 浠?outer錛堬級 閫忔槑鍦拌漿鍙戠粰 inner錛堬級錛?inner錛堬級 鍙互鐭ラ亾瀹冧滑鐨勯潪甯擱噺/甯擱噺錛?lvalue/ravlue 灞炴э紝灝卞儚inner鏄鐩存帴璋冪敤鐨勯偅鏍楓?/p>
璺?std錛氾細move() 涓鏍鳳紝 std::identify 鍜?std::forward() 閮芥槸鍦?C++<utility> 涓畾涔夌殑錛?VC10 浼氭湁錛?VC10 CTP涓病鏈夛級銆傛垜灝嗘紨紺烘庝箞鏉ュ疄鐜板畠浠傦紙鍐嶆錛屾垜灝嗕氦鏇夸嬌鐢?std::identity 鍜屾垜鐨?Identity錛?std::forward() 鍜屾垜鐨?Forward()錛屽洜涓轟粬浠殑瀹炵幇鏄瓑浠風殑銆傦級
鐜板湪錛岃鎴戜滑鏉ユ彮寮“欖旀湳“鐨勭縐橀潰綰憋紝鍏跺疄瀹冮潬鐨勫氨鏄ā鏉垮弬鏁版帹瀵煎拰寮曠敤鎶樺彔(reference collapsing)鎶鏈?/p>
rvalue 寮曠敤錛氭ā鏉垮弬鏁版帹瀵?/strong>鍜屽紩鐢ㄦ姌鍙?reference collapsing)
rvalue 寮曠敤涓庢ā鏉夸互涓縐嶇壒鍒殑鏂瑰紡鐩鎬簰浣滅敤銆備笅闈㈡槸涓涓ず渚嬶細
C:\Temp>type collapse.cpp
#include <iostream>
#include <ostream>
#include <string>
using namespace std;
template <typename T> struct Name;
template <> struct Name<string> {
static const char * get() {
return "string";
}
};
template <> struct Name<const string> {
static const char * get() {
return "const string";
}
};
template <> struct Name<string&> {
static const char * get() {
return "string&";
}
};
template <> struct Name<const string&> {
static const char * get() {
return "const string&";
}
};
template <> struct Name<string&&> {
static const char * get() {
return "string&&";
}
};
template <> struct Name<const string&&> {
static const char * get() {
return "const string&&";
}
};
template <typename T> void quark(T&& t) {
cout << "t: " << t << endl;
cout << "T: " << Name<T>::get() << endl;
cout << "T&&: " << Name<T&&>::get() << endl;
cout << endl;
}
string strange() {
return "strange()";
}
const string charm() {
return "charm()";
}
int main() {
string up("up");
const string down("down");
quark(up);
quark(down);
quark(strange());
quark(charm());
}
C:\Temp>cl /EHsc /nologo /W4 collapse.cpp
collapse.cpp
C:\Temp>collapse
t: up
T: string&
T&&: string&
t: down
T: const string&
T&&: const string&
t: strange()
T: string
T&&: string&&
t: charm()
T: const string
T&&: const string&&
榪欓噷钘夌敱 Name 鐨勬樉寮忚鏍艱鏄庢潵鎵撳嵃鍑虹被鍨嬨?/p>
褰撴垜浠皟鐢?quark(up) 鏃訛紝浼氳繘琛屾ā鏉垮弬鏁版帹瀵箋?quark() 鏄竴涓甫鏈夋ā鏉垮弬鏁?T 鐨勬ā鏉垮嚱鏁幫紝浣嗘槸鎴戜滑榪樻病鏈変負瀹冩彁渚涙樉寮忕殑綾誨瀷鍙傛暟錛堟瘮濡傚儚 quark<X>(up)榪欐牱鐨勶級銆傞氳繃姣旇緝鍑芥暟褰㈠弬綾誨瀷 Type&& 鍜屽嚱鏁板疄鍙傜被鍨嬶紙涓涓?string 綾誨瀷鐨?lvalue錛夋垜浠氨鑳芥帹瀵煎嚭妯℃澘瀹炲弬綾誨瀷銆傦紙璇戞敞錛氬師鏂囩敤 argument 琛ㄧず瀹炲弬錛宲arameter 琛ㄧず褰㈠弬錛?/p>
C++0x 浼氳漿鎹㈠嚱鏁板疄鍙傜殑綾誨瀷鍜屽艦鍙傜殑綾誨瀷錛岀劧鍚庡啀榪涜鍖歸厤銆?/p>
棣栧厛錛岃漿鎹㈠嚱鏁板疄鍙傜殑綾誨瀷銆傝繖閬靛驚涓鏉?strong>鐗規畩瑙勫垯(鎻愭N2798
鐒跺悗錛岃漿鎹㈠嚱鏁板艦鍙傜殑綾誨瀷銆備笉綆℃槸 C++98/03 榪樻槸 C++0x 閮戒細瑙i櫎寮曠敤( lvalue 寮曠敤鍜?rvalue 寮曠敤鍦?C++0x 涓兘浼氳瑙i櫎鎺?銆傚湪鍓嶉潰渚嬪瓙鐨勫洓縐嶆儏褰腑錛岃繖鏍鋒垜浠細鎶?T&& 杞崲鎴?T 銆?/p>
浜庢槸錛?T 浼氳鎺?/strong>瀵?/strong>鎴愬嚱鏁?/strong>瀹?/strong>鍙?/strong>杞崲涔嬪悗鐨?/strong>綾?/strong>鍨?/strong>銆?strong>up 鍜?down 閮芥槸 lvalue錛屽畠浠伒寰偅鏉$壒孌婅鍒欙紝榪欏氨鏄負浠涔?quark(up) 鎵撳嵃鍑?T:string&" 錛岃?quark(down) 鎵撳嵃鍑?"T: cosnt string&"鐨勫師鍥犮?strong>strange() 鍜?charm() 閮芥槸鍙沖鹼紝瀹冧滑閬靛驚涓鑸鍒欙紝榪欏氨鏄負浠涔?quark(strange()) 鎵撳嵃鍑?"T: string" 鑰?quark(charm()) 鎵撳嵃鍑?T: const string" 鐨勫師鍥犮?/p>
鏇挎崲鎿嶄綔浼氬湪綾誨瀷鎺ㄥ涔嬪悗榪涜銆傛ā鏉垮艦鍙?T 鍑虹幇鐨勬瘡涓涓湴鏂歸兘浼氳鏇挎崲鎴愭帹瀵煎嚭鏉ョ殑妯℃澘瀹炲弬綾誨瀷銆傚湪 quark(string()) 涓?T 鏄?string 錛屽洜姝?T&& 浼氭槸 string&& 銆傚悓鏍鳳紝鍦?quark(charm()) 涓紝T 鏄?const string 錛?鍥犳 T&& 鏄?const string&& 銆備絾 quark(up) 鍜?quark(down) 涓嶅悓錛屽畠浠伒寰彟澶栫殑鐗規畩瑙勫垯銆?/p>
鍦?quark(up) 涓紝 T 鏄?string& 銆傝繘琛屾浛鎹㈢殑璇?T&& 灝辨垚浜?string& && 錛屽湪 C++0x 涓細鎶樺彔錛坈ollapse錛夊紩鐢ㄧ殑寮曠敤錛?strong>寮曠敤鎶樺彔鐨?/strong>瑙勫垯灝辨槸“lvalue 寮曠敤鏄?/strong>浼?/strong>鏌撴х殑”銆?X& &, X& && 鍜?X&& & 閮戒細琚姌鍙犳垚 X& 錛屽彧鏈?X&& && 浼氳鎶樺彔鎴?X&& 銆傚洜姝?string& && 琚姌鍙犳垚 string& 銆傚湪妯℃澘涓栫晫閲岋紝閭d簺鐪嬭搗鏉ュ儚 rvalue 寮曠敤鐨勪笢瑗垮茍涓嶄竴瀹氱湡鐨勫氨鏄?鍥犺?quark(up) 琚疄渚嬪寲涓?quark<string&>() 錛岃繘鑰?T&& 緇忔浛鎹笌鎶樺彔涔嬪悗鍙樻垚 string& 銆傛垜浠彲浠ヨ皟鐢?Name<T&&>::get() 鏉ラ獙璇佽繖涓?鍚屾牱錛?quark(down) 琚疄渚嬪寲涓?quark<const string&>() 錛岃繘鑰?T&& 緇忔浛鎹笌鎶樺彔涔嬪悗鍙樻垚 const string& 銆傚湪 C++98/03涓紝浣犲彲鑳戒範鎯簡甯擱噺鎬?constness)闅愯棌浜庢ā鏉垮艦鍙備腑(涔熷氨鏄鍙互浼?const Foo 瀵硅薄浣滃疄鍙傛潵璋冪敤褰㈠弬涓?T& 鐨勬ā鏉垮嚱鏁幫紝灝卞儚 T& 浼氭槸 const Foo& 涓鏍?錛屽湪 C++0x 涓紝宸﹀煎睘鎬?lvalueness) 涔熻兘闅愯棌浜庢ā鏉垮艦鍙備腑銆?/p>
閭eソ錛岃繖涓ゆ潯鐗規畩瑙勫垯瀵規垜浠湁浠涔堝獎鍝嶏紵鍦?quark() 鍐呴儴錛岀被鍨?T&& 鏈夌潃鍜屼紶緇?quark() 鐨勫疄鍙備竴鏍風殑宸?鍙沖煎睘鎬?lvalueness/rvalueness)鍜屽父閲忔с傝繖鏍?rvalue 寮曠敤灝辮兘淇濇寔浣忓乏鍙?/strong>鍊?/strong>灞炴у拰甯擱噺鎬э紝鍋氬埌瀹岀編杞彂銆?/strong> 瀹岀編杞彂錛?std::forward() 鍜?std::identidy 鏄?/strong>鏍?/strong>宸ヤ綔鐨?/strong> 璁╂垜浠啀鏉ョ湅鐪?outer() : template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(Forward<T1>(t1), Forward<T2>(t2)); } 鐜板湪鎴戜滑鏄庣櫧浜嗕負浠涔?strong> outer() 騫?榪愮殑鏄紝涓嶅叿鍚?lvalue 寮曠敤鏄?lvalue錛屼笉鍏峰悕 rvalue 寮曠敤榪樻槸 rvalue 銆傚洜姝わ紝涓轟簡灝?t1 鍜?t2 杞彂緇?inner()錛屾垜浠渶瑕佸皢瀹冧滑浼犲埌涓涓府鍔╁嚱鏁頒腑鍘伙紝榪欎釜甯姪鍑芥暟縐婚櫎瀹冧滑鐨勫悕瀛楋紝淇濇寔浣忓畠浠殑灞炴т俊鎭傝繖灝辨槸 std::forward() 鍋氱殑浜嬫儏錛?/p>
template <typename T> struct Identity { typedef T type; }; template <typename T> T&& Forward(typename Identity<T>::type&& t) { return t; } 褰撴垜浠皟鐢?Forward<T1>(t1) 錛?Identidy 騫舵病鏈変慨鏀?T1 錛堝緢蹇垜浠鍒?Identidy 瀵?T1 鍋氫簡浠涔堬級銆傚洜姝?Forward<T1>() 鎺ユ敹 T1&& 錛岃繑鍥?T1&& 銆傝繖鏍峰氨縐婚櫎浜?t1 鐨勫悕瀛楋紝淇濇寔浣?t1 鐨勭被鍨嬩俊鎭紙鑰屼笉璁?t1 鏄粈涔堢被鍨嬶紝 string& 涔熷ソ, const string& 涔熷ソ, string&& 涔熷ソ鎴?const string&& 涔熷ソ錛夈傝繖鏍?inner() 鐪嬪埌鐨?Forward<T1>(t1) 錛屼笌 outer() 鎺ユ敹鐨勭涓涓疄鍙傛湁鐫鐩稿悓鐨勪俊鎭紝鍖呮嫭綾誨瀷錛宭valueness/rvalueness錛屽父閲忔х瓑絳夈傚畬緹庤漿鍙戝氨鏄繖鏍峰伐浣滅殑銆?/p>
浣犲彲鑳戒細濂藉濡傛灉涓嶅皬蹇冨啓鎴?Forward<T1&&>(t1) 鍙堜細鎬庢牱鍛紵錛堣繖涓敊璇繕鏄洰璇變漢鐨勶紝鍥犱負 outer() 鎺ユ敹鐨勫氨鏄?T1&& t1 錛夈傚緢騫歌繍錛屾病浠涔堝潖浜嬫儏浼氬彂鐢熴?Forward<T1&&>() 鎺ユ敹涓庤繑鍥炵殑閮芥槸 T1&& && 錛岃繖浼氳鎶樺彔鎴?T1&& 銆備簬鏄紝Forward<T1>(t1) 鍜?Forward<T1&&>(t1) 鏄瓑浠風殑錛屾垜浠洿鍋忓ソ鍓嶈咃紝鏄洜涓哄畠瑕佺煭浜涖?/p>
Identidy 鏄仛浠涔堢敤鐨勫憿錛熶負浠涔堜笅闈㈢殑浠g爜涓嶈兘宸ヤ綔錛?/p>
template <typename T> T&& Forward(T&& t) { // BROKEN return t; } 濡傛灉 Forward() 鍍忔槸涓婇潰閭f牱錛屽畠灝辮兘琚殣寮忚皟鐢紙涓嶅甫鏄庣‘鐨勬ā鏉垮弬鏁幫級銆傚綋鎴戜滑浼犵粰 Forward() 涓涓?lvalue 瀹炲弬鏃訛紝妯℃澘鍙傛暟鎺ㄥ灝變粙鍏ヤ簡錛屽鎴戜滑鍓嶉潰鐪嬪埌鐨勯偅鏍蜂細灝?T&& 鍙樻垚 T&錛屼篃灝辨槸鍙樻垚涓涓?lvalue 寮曠敤銆傞棶棰樻潵浜嗭紝鍗充嬌褰㈠弬 T1&& 鍜?T2&& 鎸囨槑鏄?rvalue 寮曠敤錛屼絾鍦?outer() 涓紝鍏峰悕鐨?t1 鍜?t2 鍗存槸 lvaue 錛岃繖涓棶棰樻槸鎴戜滑涓鐩存兂瑕佽В鍐崇殑錛佷嬌鐢ㄤ笂闈㈤偅涓敊璇殑瀹炵幇錛?Forward<T1>(t1) 鏄彲浠ュ伐浣滅殑錛岃?Foarward(t1) 铏界劧鑳介氳繃緙栬瘧錛堝緢璇變漢鍝︼級浣嗕細鍑洪敊錛屽氨濡傚畠灝辨槸 t1 涓鏍楓傜湡鏄棝鑻︾殑婧愭硥鍟婏紝鍥犳錛?strong>Identity move 璇?/strong>鎰忥細 std::move() 鏄?/strong>鏍?/strong>宸ヤ綔鐨?/strong> 鐜板湪鎴戜滑宸茬粡瀛︿範浜嗘ā鏉垮弬鏁版帹瀵煎拰寮曠敤鎶樺彔鐨勭壒孌婅鍒欙紝璁╂垜浠啀鏉ョ湅鐪?std::move() : template <typename T> struct RemoveReference { typedef T type; }; template <typename T> struct RemoveReference<T&> { typedef T type; }; template <typename T> struct RemoveReference<T&&> { typedef T type; }; template <typename T> typename RemoveReference<T>::type&& Move(T&& t) { return t; } RemoveReference 鏈哄埗鍩烘湰涓婃槸澶嶅埗 C++0x <type_traits> 涓殑 std::remove_reference 銆備婦渚嬫潵璇達紝RemoveReference<string>::type , RemoveReference<string&>::type 鍜?RemoveReference<string&&>::type 閮芥槸 string 銆?/p>
鍚屾牱錛?move() 鏈哄埗涔熷熀鏈笂鏄鍒?C++0x <utility> 涓殑 std::move()銆? · 褰撹皟鐢?Move(string), string 鏄竴涓?lvalue 鏃訛紝 T 浼氳鎺ㄥ涓?string& 錛屼簬鏄?strong> Move() · 褰撹皟鐢?Move(const string), const string 鏄竴涓?lvalue 鏃訛紝 T 浼氳鎺ㄥ涓?const string& 錛屼簬鏄?Move() 鎺ユ敹鐨勫氨鏄?const string&& (緇忔姌鍙犱箣鍚?騫惰繑鍥?const string&& (緇?RemoveReference 涔嬪悗)銆?/p>
· 褰撹皟鐢?Move(string), string 鏄竴涓?rvalue 鏃訛紝 T 浼氳鎺ㄥ涓?string 錛屼簬鏄?strong> Move() · 褰撹皟鐢?Move(const string), const string 鏄竴涓?rvalue 鏃訛紝 T 浼氳鎺ㄥ涓?const string 錛屼簬鏄?Move() 鎺ユ敹鐨勫氨鏄?const string&& 騫惰繑鍥?const string&& 銆?/p>
榪欏氨鏄?Move() 濡備綍淇濇寔鍏跺弬鏁扮殑綾誨瀷鍜屽父閲忔э紝榪樿兘鎶?lvalue 杞崲鎴?rvalue 鐨勮繃紼嬨?/p>
鍥?/strong>欏?/strong> 濡傛灉浣犳兂瀵?rvalue 寮曠敤鏈夋洿澶氫簡 瑙o紝浣犲彲浠ュ幓璇繪湁鍏沖畠浠殑鎻愭銆傝娉ㄦ剰錛屾彁妗堜笌鐜板湪鐨勫喅瀹氬彲鑳藉凡緇忎笉鍚屼簡錛?rvalue 寮曠敤宸茬粡琚暣鍚堝埌 C++0x 鑽夋涓潵浜嗭紝鍦ㄩ偅閲屽畠寰楀埌鎸佺畫鐨勬敼榪涖傛湁浜涙彁妗堟垨宸蹭笉鍐嶆紜紝鎴栧凡榪囨椂錛屾垨宸叉湁浜嗘浛浠f柟妗堬紝灝辨病鏈夎閲囩撼銆傛棤璁烘庢牱錛屽畠浠繕鏄兘鎻愪緵涓浜涙湁鐢ㄤ俊鎭殑銆?/p>
N1377, N1385, 鍜?N1690 鏄富瑕佺殑鎻愭錛?a >N2118 鍖呭惈琚暣鍚堣繘鏍囧噯鑽夋涔嬪墠鐨勬渶鍚庣増鏈?N1784, N1821, N2377, 鍜?N2439 璁板綍浜?#8220;灝?Move 璇剰鎵╁睍鍒?*this ”鐨勬紨鍖栬繃紼嬶紝榪欎釜涔熻鏁村悎鍒?C++0x 涓潵浜嗭紝浣嗚繕娌℃湁鍦╒C10 涓緱鍒板疄鐜般?/p>
灞曟湜 N2812 “Rvalue 寮曠敤鐨勫畨鍏ㄩ棶棰橈紙浠ュ強濡備綍瑙e喅錛?#8221; 鎻愬嚭浜嗗鍒濆鍖栬鍒欑殑淇敼錛屽畠紱佹 rvalue 寮曠敤緇戝畾鍒?lvalue 銆?榪欎笉浼氬獎鍝?move 璇剰鍜屽畬緹庤漿鍙戯紝鎵浠ュ畠涓嶄細璁╀綘鍒氬鍒扮殑鏂版妧鏈け鏁堬紙瀹冨彧鏄慨鏀逛簡 std::move() 鍜?std::forward() 鐨勫疄鐜幫級銆?/p>
Stephan T. Lavavej Visual C++ Libraries Developer Published Tuesday, February 03, 2009 9:27 AM by vcblog 緲昏瘧錛?a href="http://m.shnenglu.com/kesalin/">椋橀鐧戒簯 (杞澆鏃惰娉ㄦ槑浣滆呭拰鍑哄銆傛湭緇忚鍙紝璇峰嬁鐢ㄤ簬鍟嗕笟鐢ㄩ?
]]>
(杞澆鏃惰娉ㄦ槑浣滆呭拰鍑哄銆傛湭緇忚鍙紝璇峰嬁鐢ㄤ簬鍟嗕笟鐢ㄩ?
綆浠?
榪欎竴緋誨垪鏂囩珷浠嬬粛Microsoft Visual Studio 2010 涓敮鎸佺殑C++ 0x鐗規э紝鐩墠鏈変笁閮ㄥ垎銆?
Part 1 錛氫粙緇嶄簡Lambdas錛?璧嬩簣鏂版剰涔夌殑auto錛屼互鍙?static_assert錛?
Part 2( 涓 , 浜?/a> , 涓?/a> )錛氫粙緇嶄簡鍙沖煎紩鐢紙Rvalue References錛夛紱
Part 3錛氫粙緇嶄簡琛ㄨ揪寮忕被鍨嬶紙decltype錛?br>
VC10涓殑C++0x鐗規?Part 1,2,3 璇戞枃鎵撳寘涓嬭澆錛坉oc 鍜?pdf 鏍煎紡錛夛細 鐐規涓嬭澆
move 璇剰錛氫粠 lvalue 縐誨姩
鐜板湪錛屽鏋滀綘鍠滄鐢ㄦ嫹璐濊祴鍊煎嚱鏁版潵瀹炵幇浣犵殑鎷瘋礉鏋勯犲嚱鏁拌鎬庢牱鍋氬憿錛岄偅浣犱篃鍙兘璇曞浘鐢?move 鎷瘋礉璧嬪煎嚱鏁版潵瀹炵幇 move 鏋勯犲嚱鏁般傝繖鏍蜂綔鏄彲浠ョ殑錛屼絾鏄綘寰楀皬蹇冦備笅闈㈠氨鏄竴涓敊璇殑瀹炵幇錛?/p>
C:\Temp>type unified_wrong.cpp
#include <stddef.h>
#include <iostream>
#include <ostream>
using namespace std;
class remote_integer {
public:
remote_integer() {
cout << "Default constructor." << endl;
m_p = NULL;
}
explicit remote_integer(const int n) {
cout << "Unary constructor." << endl;
m_p = new int(n);
}
remote_integer(const remote_integer& other) {
cout << "Copy constructor." << endl;
m_p = NULL;
*this = other;
}
#ifdef MOVABLE
remote_integer(remote_integer&& other) {
cout << "MOVE CONSTRUCTOR." << endl;
m_p = NULL;
*this = other; // WRONG
}
#endif // #ifdef MOVABLE
remote_integer& operator=(const remote_integer& other) {
cout << "Copy assignment operator." << endl;
if (this != &other) {
delete m_p;
if (other.m_p) {
m_p = new int(*other.m_p);
} else {
m_p = NULL;
}
}
return *this;
}
#ifdef MOVABLE
remote_integer& operator=(remote_integer&& other) {
cout << "MOVE ASSIGNMENT OPERATOR." << endl;
if (this != &other) {
delete m_p;
m_p = other.m_p;
other.m_p = NULL;
}
return *this;
}
#endif // #ifdef MOVABLE
~remote_integer() {
cout << "Destructor." << endl;
delete m_p;
}
int get() const {
return m_p ? *m_p : 0;
}
private:
int * m_p;
};
remote_integer frumple(const int n) {
if (n == 1729) {
return remote_integer(1729);
}
remote_integer ret(n * n);
return ret;
}
int main() {
remote_integer x = frumple(5);
cout << x.get() << endl;
remote_integer y = frumple(1729);
cout << y.get() << endl;
}
C:\Temp>cl /EHsc /nologo /W4 /O2 unified_wrong.cpp
unified_wrong.cpp
C:\Temp>unified_wrong
Unary constructor.
Copy constructor.
Copy assignment operator.
Destructor.
25
Unary constructor.
1729
Destructor.
Destructor.
C:\Temp>cl /EHsc /nologo /W4 /O2 /DMOVABLE unified_wrong.cpp
unified_wrong.cpp
C:\Temp>unified_wrong
Unary constructor.
MOVE CONSTRUCTOR.
Copy assignment operator.
Destructor.
25
Unary constructor.
1729
Destructor.
Destructor.
(緙栬瘧鍣ㄥ湪榪欓噷榪涜浜嗚繑鍥炲間紭鍖?RVO)錛屼絾涓嶆槸鍏峰悕榪斿洖鍊間紭鍖?NRVO)銆傚氨鍍忔垜涔嬪墠鎻愬埌鐨勶紝鏈変簺鎷瘋礉鏋勯犲嚱鏁拌 RVO 鎴?NRVO 浼樺寲鎺変簡錛屼絾緙栬瘧鍣ㄥ茍涓嶆繪槸鑳藉鍋氳繖鏍風殑浼樺寲錛岃繖鏃跺墿浣欑殑灝辯敱 move 鏋勯犲嚱鏁版潵浼樺寲銆?
move 鏋勯犲嚱鏁頒腑鏍囪涓?WRONG 鐨勯偅涓琛岋紝璋冪敤浜嗘嫹璐濊祴鍊煎嚱鏁幫紝緙栬瘧鑳介氳繃涔熻兘榪愯錛屼絾榪欒繚鑳屼簡 move 鏋勯犲嚱鏁扮殑鏈剰銆傦紙璇戞敞錛氬洜涓洪偅涓嫹璐濊祴鍊煎嚱鏁板彧鏄繘琛屾櫘閫氱殑鎷瘋礉璧嬪鹼紝鑰屼笉鏄?move 璧嬪鹼紒錛?/p>
榪欐槸鎬庝箞鍥炰簨鍛紵璁頒綇錛氬湪C++98/03涓紝鍏峰悕 lvalue 寮曠敤鏄乏鍊?緇欏畾璇彞 int& r = *p; r 鏄?lvalue)錛屼笉鍏峰悕 lvalue 寮曠敤榪樻槸宸﹀?緇欏畾璇彞 vector<int> v(10, 1729)錛?v[0] 榪斿洖 int&錛?浣犲彲浠ュ榪欎釜涓嶅叿鍚?lvalue 寮曠敤鍙栧潃)銆備絾鏄?rvalue 寮曠敤灝變笉涓鏍蜂簡錛?/p>
飩?/strong> 鍏峰悕 lvalue 寮曠敤鏄?/strong> lvalue銆?/strong>
飩?/strong> 涓嶅叿鍚?/strong> rvalue 寮曠敤鏄?/strong> rvalue銆?/strong>
涓涓叿鍚?rvalue 寮曠敤鏄竴涓?lvalue 鏄洜涓哄彲浠ュ瀹冩柦鍔犲閲嶆搷浣滐紝閲嶅浣跨敤銆傜浉鍙嶏紝濡傛灉瀹冩槸涓涓?ravlue 鐨勮瘽錛岄偅涔堝瀹冩柦鍔犵殑絎竴涓搷浣滆兘澶?#8220;紿冨彇”瀹冿紝鑰屽悗緇搷浣滃氨娌℃満浼氫簡銆傝繖閲岀殑“紿冨彇”鏄涓嶄細琚療瑙夊埌錛屾墍浠ヨ繖鏄涓嶉氱殑銆傚彟涓鏂歸潰錛屼笉鍏峰悕 rvalue 寮曠敤涓嶈兘琚噸澶嶄嬌鐢紝鎵浠ュ畠浠嶄繚鎸佸彸鍊?rvalueness)璇剰銆?/p>
濡傛灉浣犵湡鐨勬墦綆楃敤 move 璧嬪煎嚱鏁版潵瀹炵幇 move 鏋勯犲嚱鏁幫紝浣犻渶瑕佷粠 lvalue move錛屽氨鍍忔槸浠?rvalue move 涓鏍楓侰++0x <utility> 涓殑 std::move() 鍏峰榪欐牱鐨勮兘鍔涳紝VC10灝嗕細鏈夎繖涓紙瀹為檯涓婏紝寮鍙戠増涓凡緇忔湁浜嗭級錛屼絾VC10 TCP鐗堣繕娌℃湁錛屾墍浠ユ垜浼氭暀浣犱粠澶村仛璧鳳細
C:\Temp>type unified_right.cpp
#include <stddef.h>
#include <iostream>
#include <ostream>
using namespace std;
template <typename T> struct RemoveReference {
typedef T type;
};
template <typename T> struct RemoveReference<T&> {
typedef T type;
};
template <typename T> struct RemoveReference<T&&> {
typedef T type;
};
template <typename T> typename RemoveReference<T>::type&& Move(T&& t) {
return t;
}
class remote_integer {
public:
remote_integer() {
cout << "Default constructor." << endl;
m_p = NULL;
}
explicit remote_integer(const int n) {
cout << "Unary constructor." << endl;
m_p = new int(n);
}
remote_integer(const remote_integer& other) {
cout << "Copy constructor." << endl;
m_p = NULL;
*this = other;
}
#ifdef MOVABLE
remote_integer(remote_integer&& other) {
cout << "MOVE CONSTRUCTOR." << endl;
m_p = NULL;
*this = Move(other); // RIGHT
}
#endif // #ifdef MOVABLE
remote_integer& operator=(const remote_integer& other) {
cout << "Copy assignment operator." << endl;
if (this != &other) {
delete m_p;
if (other.m_p) {
m_p = new int(*other.m_p);
} else {
m_p = NULL;
}
}
return *this;
}
#ifdef MOVABLE
remote_integer& operator=(remote_integer&& other) {
cout << "MOVE ASSIGNMENT OPERATOR." << endl;
if (this != &other) {
delete m_p;
m_p = other.m_p;
other.m_p = NULL;
}
return *this;
}
#endif // #ifdef MOVABLE
~remote_integer() {
cout << "Destructor." << endl;
delete m_p;
}
int get() const {
return m_p ? *m_p : 0;
}
private:
int * m_p;
};
remote_integer frumple(const int n) {
if (n == 1729) {
return remote_integer(1729);
}
remote_integer ret(n * n);
return ret;
}
int main() {
remote_integer x = frumple(5);
cout << x.get() << endl;
remote_integer y = frumple(1729);
cout << y.get() << endl;
}
C:\Temp>cl /EHsc /nologo /W4 /O2 /DMOVABLE unified_right.cpp
unified_right.cpp
C:\Temp>unified_right
Unary constructor.
MOVE CONSTRUCTOR.
MOVE ASSIGNMENT OPERATOR.
Destructor.
25
Unary constructor.
1729
Destructor.
Destructor.
錛堟垜灝嗕氦鏇夸嬌鐢?std::move() 鍜屾垜鑷繁鐨?Move()錛屽洜涓哄畠浠殑瀹炵幇鏄瓑浠風殑錛?std::move() 鏄庢牱宸ヤ綔鐨勫憿錛熺洰鍓嶏紝鎴戝彧鑳借窡浣犺榪欐槸“欖旀硶”銆傦紙鍚庨潰浼氭湁瀹屾暣鐨勮В閲婏紝騫朵笉澶嶆潅錛屼絾瀹冧笌妯℃澘鍙傛暟鎺ㄥ鍜屽紩鐢ㄦ姌鍙狅紙reference collapsing錛岃瘧娉細寮曠敤鐨勫紩鐢級鏈?鍏籌紝鍚庨潰璁插畬緹庤漿鍙戠殑鏃跺欐垜浠繕浼氶亣鍒拌繖涓や釜涓滆タ錛夈傛垜鍙互鐢ㄤ竴涓叿浣撶殑渚嬪瓙鏉ョ暐榪?#8220;欖旀硶”錛氱粰瀹氫竴涓?string 綾誨瀷鐨勫乏鍊鹼紝鍍忓墠闈㈤噸杞藉喅璁緥瀛愪腑鐨?up 錛宻td::move(up) 璋冪敤 string&& std::move(string&)錛岃繖涓嚱鏁拌繑鍥炰竴涓笉鍏峰悕鐨?rvalue 寮曠敤錛屽畠鏄竴涓?rvalue銆傜粰瀹氫竴涓?string 綾誨瀷鐨?rvalue錛屽儚鍓嶉潰閲嶈澆鍐寵渚嬪瓙涓殑 strange()錛?std::move(strange()) 璋冪敤 string&& std::move(string&&)錛屽悓鏍瘋繖涓嚱鏁拌繕鏄繑鍥炰竴涓笉鍏峰悕鐨?rvalue錛岃繕鏄?rvalue銆?/p>
std::move() 闄や簡璁╀綘鑳界敤 move 澶嶅埗鍑芥暟鏉ュ疄鐜?move 鏋勯犲嚱鏁頒箣澶栵紝榪樿兘鍦ㄥ叾浠栧湴鏂瑰彂鎸ヤ綔鐢ㄣ傛棤璁轟綍鏃訛紝鍙浣犳湁涓涓乏鍊鹼紝鑰屽畠鐨勫間篃涓嶅啀閲嶈浜嗭紙渚嬪錛屽畠灝嗚閿姣佹垨琚祴鍊鹼級錛屼綘灝卞彲浠ヤ嬌鐢?std::move(浣犵殑宸﹀艱〃杈懼紡) 鏉ヤ嬌鐢?move 璇剰銆?/p>
move 璇剰錛氬彲縐誨姩鎴愬憳錛?/strong>movable member)
C++0x 鐨勬爣鍑嗙被鍨嬶紙鍍?vector, string, regex錛?閮芥湁 move 鏋勯犲嚱鏁板拰 move 璧嬪煎嚱鏁般傝屼笖鎴戜滑涔熷凡緇忕湅鍒頒簡濡備綍鍦ㄦ垜浠嚜宸辯殑綾諱腑閫氳繃鎵嬪姩綆$悊璧勬簮鏉ュ疄鐜?move 璇剰錛堝儚鍓嶉潰鐨?remote_integer 綾伙級銆傚鏋滅被涓寘鍚彲縐誨姩鏁版嵁鎴愬憳錛堝儚 vector, string, regex, remote_integer 錛夋椂璇ユ庝箞鍔炲憿錛熺紪璇戝櫒涓嶄細鑷姩甯垜浠嚜鍔ㄤ駭鐢?move 鏋勯犲嚱鏁板拰 move 璧嬪煎嚱鏁幫紝鎵浠ユ垜浠繀欏繪墜鍔ㄧ紪鍐欏畠浠傚緢騫歌繍錛屾湁浜?std::move() 緙栧啓瀹冧滑鏄緢瀹規槗鐨勩?/p>
C:\Temp>type point.cpp
#include <stddef.h>
#include <iostream>
#include <ostream>
using namespace std;
template <typename T> struct RemoveReference {
typedef T type;
};
template <typename T> struct RemoveReference<T&> {
typedef T type;
};
template <typename T> struct RemoveReference<T&&> {
typedef T type;
};
template <typename T> typename RemoveReference<T>::type&& Move(T&& t) {
return t;
}
class remote_integer {
public:
remote_integer() {
cout << "Default constructor." << endl;
m_p = NULL;
}
explicit remote_integer(const int n) {
cout << "Unary constructor." << endl;
m_p = new int(n);
}
remote_integer(const remote_integer& other) {
cout << "Copy constructor." << endl;
if (other.m_p) {
m_p = new int(*other.m_p);
} else {
m_p = NULL;
}
}
remote_integer(remote_integer&& other) {
cout << "MOVE CONSTRUCTOR." << endl;
m_p = other.m_p;
other.m_p = NULL;
}
remote_integer& operator=(const remote_integer& other) {
cout << "Copy assignment operator." << endl;
if (this != &other) {
delete m_p;
if (other.m_p) {
m_p = new int(*other.m_p);
} else {
m_p = NULL;
}
}
return *this;
}
remote_integer& operator=(remote_integer&& other) {
cout << "MOVE ASSIGNMENT OPERATOR." << endl;
if (this != &other) {
delete m_p;
m_p = other.m_p;
other.m_p = NULL;
}
return *this;
}
~remote_integer() {
cout << "Destructor." << endl;
delete m_p;
}
int get() const {
return m_p ? *m_p : 0;
}
private:
int * m_p;
};
class remote_point {
public:
remote_point(const int x_arg, const int y_arg)
: m_x(x_arg), m_y(y_arg) { }
remote_point(remote_point&& other)
: m_x(Move(other.m_x)),
m_y(Move(other.m_y)) { }
remote_point& operator=(remote_point&& other) {
m_x = Move(other.m_x);
m_y = Move(other.m_y);
return *this;
}
int x() const { return m_x.get(); }
int y() const { return m_y.get(); }
private:
remote_integer m_x;
remote_integer m_y;
};
remote_point five_by_five() {
return remote_point(5, 5);
}
remote_point taxicab(const int n) {
if (n == 0) {
return remote_point(1, 1728);
}
remote_point ret(729, 1000);
return ret;
}
int main() {
remote_point p = taxicab(43112609);
cout << "(" << p.x() << ", " << p.y() << ")" << endl;
p = five_by_five();
cout << "(" << p.x() << ", " << p.y() << ")" << endl;
}
C:\Temp>cl /EHsc /nologo /W4 /O2 point.cpp
point.cpp
C:\Temp>point
Unary constructor.
Unary constructor.
MOVE CONSTRUCTOR.
MOVE CONSTRUCTOR.
Destructor.
Destructor.
(729, 1000)
Unary constructor.
Unary constructor.
MOVE ASSIGNMENT OPERATOR.
MOVE ASSIGNMENT OPERATOR.
Destructor.
Destructor.
(5, 5)
Destructor.
Destructor.
鐜板湪浣犵湅鍒板暒錛屾寜鎴愬憳縐誨姩錛坢emberwise move錛夋槸寰堝鏄撳仛鍒扮殑銆傛敞鎰忥紝 remote_point 鐨?move 璧嬪煎嚱鏁版病鏈夎繘琛岃嚜鎴戣祴鍊兼鏌ワ紝鏄洜涓?remote_integer 宸茬粡媯鏌ヨ繃浜嗐備篃瑕佹敞鎰忓埌 remote_point 闅愬紡澹版槑鐨勬嫹璐濇瀯閫犲嚱鏁幫紝鎷瘋礉璧嬪煎嚱鏁板拰鏋愭瀯鍑芥暟閮芥甯歌繍浣溿?/p>
鍒扮幇鍦紝浣犲簲璇ュ move 璇剰宸茬粡闈炲父鐔熸倝浜嗐傦紙甯屾湜涓嶆槸鎶撶媯鍟婏紒錛変負浜嗘祴璇曚綘鏂拌幏寰楃殑榪欎釜涓嶅彲鎬濊鐨勬妧鑳斤紝璇蜂負鍓嶉潰鐨勪緥瀛愬啓涓涓?+() 鎿嶄綔絎﹀嚱鏁板綋浣滅粌涔犲惂銆?/p>
鏈鍚庣殑鎻愰啋錛氬彧瑕佷綘鐨勭被鏀寔 move 璇剰錛屼綘灝卞簲璇ュ疄鐜?move 鏋勯犲嚱鏁板拰 move 璧嬪煎嚱鏁般傚洜涓轟笉浠呬粎鏄綘騫沖父浣跨敤榪欎簺綾繪椂鍙粠 move 璇剰涓幏鍒╋紝 STL 瀹瑰櫒鍜岀畻娉曚篃鑳戒粠涓幏鍒╋紝閫氳繃寤変環鐨?move 鐪佷笅鏄傝吹鐨勬嫹璐濆紑閿銆?/p>
(杞澆璇鋒敞鏄庡嚭澶勶紝浣滆呬笌璇戣呬俊鎭紝璇峰嬁鐢ㄤ簬鍟嗕笟鐢ㄩ?