C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::optional
- std::any
- std::variant
- æ ¼å¼ååº (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- å忰彿°
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注é
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å·¥å ·åº > std::move
std::move
| å®ä¹äºå¤´æä»¶ <utility>
|
||
| template< class T > typename std::remove_reference<T>::type&& move( T&& t ) noexcept; |
(C++11 èµ·) (C++14 å) |
|
| template< class T > constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept; |
(C++14 èµ·) | |
std::move ç¨äºæç¤ºå¯¹è±¡ t å¯ä»¥â被移å¨âï¼å³å
è®¸ä» t å°å¦ä¸å¯¹è±¡çææççèµæºä¼ éã
ç¹å«æ¯ï¼ std::move çææ è¯å
¶åæ° t ç亡å¼è¡¨è¾¾å¼ãå®åç¡®å°çä»·äºå°å³å¼å¼ç¨ç±»åç static_cast ã
åæ°
| t | - | è¦è¢«ç§»å¨ç对象 |
è¿åå¼
static_cast<typename std::remove_reference<T>::type&&>(t)
注æ
以å³å¼åæ°ï¼å¦ä¸´æ¶å¯¹è±¡ç纯å³å¼æå¦ std::move æäº§çè
ç亡å¼ä¹ä¸ï¼è°ç¨å½æ°æ¶ï¼éè½½å³è®®éæ©æ¥åå³å¼å¼ç¨åæ°ççæ¬ï¼å
å«ç§»å¨æé 彿°ãç§»å¨èµå¼è¿ç®ç¬¦åå¸¸è§æå彿°ï¼å¦ std::vector::push_back ï¼ãè¥åæ°æ è¯ä¸ä¸ªå æèµæºç对象ï¼åè¿äºéè½½æ¥æç§»å¨åæ°æä¿æçä»»ä½èµæºçéæ©ï¼ä½ä¸å¼ºæ±å¦æ¤ãä¾å¦ï¼é¾è¡¨çç§»å¨æé 彿°å¯ä»¥å¤å¶æå表头çæéï¼å¹¶å° nullptr åå¨å°åæ°ä¸ï¼èéåé
å¹¶å¤å¶é个ç»ç¹ã
å³å¼å¼ç¨åéçåç§°æ¯å·¦å¼ï¼èè¥è¦ç»å®å°æ¥åå³å¼å¼ç¨åæ°çéè½½ï¼å°±å¿ 须转æ¢å°äº¡å¼ï¼æ¤ä¹ç§»å¨æé 彿°ä¸ç§»å¨èµå¼è¿ç®ç¬¦å ¸åå°ä½¿ç¨ std::move çåå ï¼
// ç®åçç§»å¨æé 彿° A(A&& arg) : member(std::move(arg.member)) // è¡¨è¾¾å¼ "arg.member" ä¸ºå·¦å¼ {} // ç®åçç§»å¨èµå¼è¿ç®ç¬¦ A& operator=(A&& other) { member = std::move(other.member); return *this; }
ä¸ä¸ªä¾å¤æ¯å½å½æ°åæ°ç±»åæ¯å°æ¨¡æ¿å½¢åçå³å¼å¼ç¨ï¼â转åå¼ç¨âæâéç¨å¼ç¨âï¼æ¶ï¼è¯¥æ åµä¸è½¬èä½¿ç¨ std::forward ã
é¤éå¦å¤æå®ï¼å¦åææå·²è¢«ç§»å¨çæ ååºå¯¹è±¡è¢«ç½®äºåæ³ä½æªæå®çç¶æãå³åªææ åæç彿°ï¼ä¾å¦èµå¼è¿ç®ç¬¦ï¼æè½å®å ¨å°å¨å¯¹è±¡è¢«ç§»å¨å使ç¨ï¼
std::vector<std::string> v; std::string str = "example"; v.push_back(std::move(str)); // str ç°å¨åæ³ä½æªæå® str.back(); // è¥ size() == 0 å为æªå®ä¹è¡ä¸ºï¼ back() æ¥æåæÂ !empty() str.clear(); // OK ï¼ clear() æ åæ
èä¸ï¼ä»¥äº¡å¼åæ°è°ç¨çæ ååºå½æ°å¯ä»¥åè®¾è¯¥åæ°æ¯å°å¯¹è±¡çå¯ä¸å¼ç¨ï¼è¥å®ä»å·¦å¼å¸¦ std::move æé ï¼åä¸è¿è¡å«åæ£æ¥ãå°¤å
¶æ¯ï¼è¿è¡¨ææ ååºç§»å¨è¿ç®ç¬¦ä¸è¿è¡èªèµå¼æ£æ¥ï¼
std::vector<int> v = {2, 3, 3}; v = std::move(v); // æªå®ä¹è¡ä¸º
示ä¾
#include <iostream> #include <utility> #include <vector> #include <string>  int main() { std::string str = "Hello"; std::vector<std::string> v;  // ä½¿ç¨ push_back(const T&) éè½½ï¼ // 表示æä»¬å°å¸¦æ¥å¤å¶ str çææ¬ v.push_back(str); std::cout << "After copy, str is \"" << str << "\"\n";  // 使ç¨å³å¼å¼ç¨ push_back(T&&) éè½½ï¼ // 表示ä¸å¤å¶å符串ï¼èæ¯ // str çå 容被移å¨è¿ vector // è¿ä¸ªå¼éæ¯è¾ä½ï¼ä½ä¹æå³ç str ç°å¨å¯è½ä¸ºç©ºã v.push_back(std::move(str)); std::cout << "After move, str is \"" << str << "\"\n";  std::cout << "The contents of the vector are \"" << v[0] << "\", \"" << v[1] << "\"\n"; }
å¯è½çè¾åºï¼
After copy, str is "Hello" After move, str is "" The contents of the vector are "Hello", "Hello"
åé
| (C++11) |
转åä¸ä¸ªå½æ°å®å (彿°æ¨¡æ¿) |
| (C++11) |
è¥ç§»å¨æé 彿°ä¸æåºåè·å¾å³å¼å¼ç¨ (彿°æ¨¡æ¿) |
| (C++11) |
å°æä¸èå´çå
ç´ ç§»å¨å°ä¸ä¸ªæ°çä½ç½® (彿°æ¨¡æ¿) |