å³å¼å¼ç¨æ¯C++11ä¸æéè¦çæ°ç¹æ§ä¹ä¸ï¼å®è§£å³äºC++ä¸å¤§éçåå²éçé®é¢ï¼ä½¿C++æ ååºçå®ç°å¨å¤ç§åºæ¯ä¸æ¶é¤äºä¸å¿
è¦çé¢å¤å¼éï¼å¦std::vector, std::string)ï¼ä¹ä½¿å¾å¦å¤ä¸äºæ ååºï¼å¦std::unique_ptr, std::functionï¼æ为å¯è½ãå³ä½¿ä½ 并ä¸ç´æ¥ä½¿ç¨å³å¼å¼ç¨ï¼ä¹å¯ä»¥éè¿æ ååºï¼é´æ¥ä»è¿ä¸æ°ç¹æ§ä¸åçã为äºæ´å¥½çç解æ ååºç»åå³å¼å¼ç¨å¸¦æ¥çä¼åï¼æ们æå¿
è¦äºè§£ä¸ä¸å³å¼å¼ç¨çé大æä¹ã
å³å¼å¼ç¨çæä¹é常解é为两大ä½ç¨ï¼ç§»å¨è¯ä¹åå®ç¾è½¬åãæ¬æ主è¦è®¨è®ºç§»å¨è¯ä¹ã
移å¨è¯ä¹
======
移å¨è¯ä¹ï¼ç®åæ¥è¯´è§£å³çæ¯åç§æ
å½¢ä¸å¯¹è±¡çèµæºæææ转移çé®é¢ãèå¨C++11ä¹åï¼ç§»å¨è¯ä¹ç缺失æ¯C++饱åè¯ç
çé®é¢ä¹ä¸ã
举个æ åã
é®é¢ä¸ï¼å¦ä½å°
大象æ¾å
¥å°ç®±ï¼
çæ¡æ¯ä¼æå¨ç¥çãé¦å
ä½ éè¦æä¸å°ç¹æ®çå°ç®±ï¼è¿å°å°ç®±æ¯ä¸ºäºè£
ä¸å¤§è±¡èå¶é çãä½ æå¼å°ç®±é¨ï¼å°å¤§è±¡æ¾å
¥å°ç®±ï¼ç¶åå
³ä¸å°ç®±é¨ã
é®é¢äºï¼å¦ä½å°å¤§è±¡ä»ä¸å°å°ç®±è½¬ç§»å°å¦ä¸å°å°ç®±ï¼
æ®é解çï¼æå¼å°ç®±é¨ï¼ååºå¤§è±¡ï¼å
³ä¸å°ç®±é¨ï¼æå¼å¦ä¸å°å°ç®±é¨ï¼æ¾è¿å¤§è±¡ï¼å
³ä¸å°ç®±é¨ã
2B解çï¼å¨ç¬¬äºä¸ªå°ç®±ä¸å¯å¨éåå¤å¶ç³»ç»ï¼å
éä¸åªå®å
¨ç¸åç大象ï¼ç¶åå¯å¨é«è½æ¿å
å°ç¬¬ä¸ä¸ªå°ç®±å
ç大象æ°åæ¶å¤±ã
ççï¼è¿ä¸ª2B解çå¬èµ·æ¥å¾è³çï¼è¿ä¸å°±æ¯C++ä¸è¦ç§»å¨ä¸ä¸ªå¯¹è±¡æ¶æåçäºæ
åï¼
â移å¨âï¼è¿æ¯ä¸ä¸ªä¸å²å°å©é½æç½çæ¦å¿µãå°å¤§è±¡ï¼èµæºï¼ä»ä¸å°å°ç®±ï¼å¯¹è±¡ï¼ç§»å¨å°å¦ä¸å°å°ç®±ï¼è¿ä¸ªè¡ä¸ºæ¯å¦æ¤èªç¶ï¼æ²¡æä»»ä½äººä¼éç¨å
å¤å¶å¤§è±¡ï¼åéæ¯å¤§è±¡è¿æ ·åªå¤·ææçæ¹æ³ãC++éè¿æ·è´æé å½æ°åæ·è´èµå¼æä½ç¬¦ä¸ºç±»è®¾è®¡äºæ·è´/å¤å¶çæ¦å¿µï¼ä½ä¸ºäºå®ç°å¯¹èµæºç移å¨æä½ï¼è°ç¨è
å¿
须使ç¨å
å¤å¶ãåææçæ¹å¼ãå¦åï¼å°±éè¦èªå·±å®ç°ç§»å¨èµæºçæ¥å£ã
为äºå®ç°ç§»å¨è¯ä¹ï¼é¦å
éè¦è§£å³çé®é¢æ¯ï¼å¦ä½æ è¯å¯¹è±¡çèµæºæ¯å¯ä»¥è¢«ç§»å¨çå¢ï¼è¿ç§æºå¶å¿
须以ä¸ç§æä½å¼éçæ¹å¼å®ç°ï¼å¹¶ä¸å¯¹ææçç±»é½ææãC++ç设计è
们注æå°ï¼å¤§å¤æ°æ
åµä¸ï¼å³å¼æå
å«ç对象é½æ¯å¯ä»¥å®å
¨ç被移å¨çã
å³å¼ï¼ç¸å¯¹åºçè¿æå·¦å¼ï¼æ¯ä»Cè¯è¨è®¾è®¡æ¶å°±æçæ¦å¿µï¼ä½å 为å
¶å¦æ¤åºç¡ï¼ä¹æ¯ä¸ä¸ªæ常被忽ç¥çæ¦å¿µãä¸ä¸¥æ ¼çæ¥è¯´ï¼å·¦å¼å¯¹åºåéçåå¨ä½ç½®ï¼èå³å¼å¯¹åºåéçå¼æ¬èº«ãC++ä¸å³å¼å¯ä»¥è¢«èµå¼ç»å·¦å¼æè
ç»å®å°å¼ç¨ãç±»çå³å¼æ¯ä¸ä¸ªä¸´æ¶å¯¹è±¡ï¼å¦æ没æ被ç»å®å°å¼ç¨ï¼å¨
表达å¼ç»ææ¶å°±ä¼è¢«åºå¼ãäºæ¯æ们å¯ä»¥å¨å³å¼è¢«åºå¼ä¹åï¼ç§»èµ°å®çèµæºè¿è¡åºç©å©ç¨ï¼ä»èé¿å
æ æä¹çå¤å¶ã被移走èµæºçå³å¼å¨åºå¼æ¶å·²ç»æ为空壳ï¼ææçå¼éä¹ä¼éä½ã
å³å¼ä¸çæ°æ®å¯ä»¥è¢«å®å
¨ç§»èµ°è¿ä¸ç¹æ§ä½¿å¾å³å¼è¢«ç¨æ¥è¡¨è¾¾ç§»å¨è¯ä¹ã以åç±»åçå³å¼æé 对象æ¶ï¼éè¦ä»¥å¼ç¨å½¢å¼ä¼ å
¥åæ°ãå³å¼å¼ç¨é¡¾åæä¹ä¸é¨ç¨æ¥å¼ç¨å³å¼ï¼å·¦å¼å¼ç¨åå³å¼å¼ç¨å¯ä»¥è¢«åå«éè½½ï¼è¿æ ·ç¡®ä¿å·¦å¼åå³å¼åå«è°ç¨å°æ·è´å移å¨ç两ç§è¯ä¹å®ç°ã对äºå·¦å¼ï¼å¦ææ们æç¡®æ¾å¼å¯¹å
¶èµæºçæææï¼åå¯ä»¥éè¿std::move()æ¥å°å
¶è½¬ä¸ºå³å¼å¼ç¨ãstd::move()å®é
ä¸æ¯
static_cast<T&&>()çç®åå°è£
ã