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::exchange
std::exchange
| å®ä¹äºå¤´æä»¶ <utility>
|
||
| template< class T, class U = T > T exchange( T& obj, U&& new_value ); |
(C++14 èµ·) (C++20 å) |
|
| template< class T, class U = T > constexpr T exchange( T& obj, U&& new_value ); |
(C++20 èµ·) | |
以 new_value æ¿æ¢ obj çå¼ï¼å¹¶è¿å obj çæ§å¼ã
åæ°
| obj | - | è¦æ¿æ¢å¼ç对象 |
| new_value | - | è¦èµç» obj çå¼
|
| ç±»åè¦æ± | ||
-T å¿
须满足å¯ç§»å¨æé (MoveConstructible) çè¦æ±ãèä¸å¿
é¡»è½ç§»å¨èµå¼ U ç±»åå¯¹è±¡ç» T ç±»å对象
| ||
è¿åå¼
obj çæ§å¼
å¼å¸¸
ï¼æ ï¼
å¯è½çå®ç°
template<class T, class U = T> T exchange(T& obj, U&& new_value) { T old_value = std::move(obj); obj = std::forward<U>(new_value); return old_value; } |
注æ
è½å¨å®ç°ç§»å¨èµå¼è¿ç®ç¬¦åç§»å¨æé 彿°æ¶ä½¿ç¨æ¤å½æ°ï¼
struct S { int* p; int n;  S(S&& other) :p{std::exchange(other.p, nullptr)} ,n{std::exchange(other.n, 0)} {}  S& operator=(S&& other) { p = std::exchange(other.p, nullptr); // ç§»å¨ p ï¼åæ¶ç nullptr äº other.p ä¸ n = std::exchange(other.n, 0); // ç§»å¨ n ï¼åæ¶çé¶äº other.n ä¸ return *this; } };
示ä¾
è¿è¡æ¤ä»£ç
#include <iostream> #include <utility> #include <vector> #include <iterator>  class stream { public:  using flags_type = int;  public:  flags_type flags() const { return flags_; }  /// 以 newf æ¿æ¢ flags_ å¹¶è¿åæ§å¼ã flags_type flags(flags_type newf) { return std::exchange(flags_, newf); }  private:  flags_type flags_ = 0; };  void f() { std::cout << "f()"; }  int main() { stream s;  std::cout << s.flags() << '\n'; std::cout << s.flags(12) << '\n'; std::cout << s.flags() << "\n\n";  std::vector<int> v;  // å ä¸ºç¬¬äºæ¨¡æ¿å½¢åæé»è®¤å¼ï¼æ è½ä»¥è±æ¬å·åå§ååå¨è¡¨ä¸ºç¬¬äºåæ°ã // 䏿¹è¡¨è¾¾å¼çä»·äº std::exchange(v, std::vector<int>{1,2,3,4});  std::exchange(v, {1,2,3,4});  std::copy(begin(v),end(v), std::ostream_iterator<int>(std::cout,", "));  std::cout << "\n\n";  void (*fun)();  // 模æ¿å½¢åçé»è®¤å¼äº¦ä½¿å¾è½ä»¥é叏彿°ä¸ºç¬¬äºåæ°ã // 䏿¹è¡¨è¾¾å¼çä»·äº std::exchange(fun, static_cast<void(*)()>(f)) std::exchange(fun,f); fun(); }
è¾åºï¼
0 0 12 Â 1, 2, 3, 4, Â f()
åé
| 交æ¢ä¸¤ä¸ªå¯¹è±¡çå¼ (彿°æ¨¡æ¿) | |
| (C++11)(C++11) |
ååå°ä»¥éååå®åç弿¿æ¢åå对象çå¼ï¼å¹¶è¿å该ååå¯¹è±¡çæ§å¼ (彿°æ¨¡æ¿) |