exchange — std::exchange
exchange — std::exchange
std::exchange는 객체 obj의 값을 new_value로 바꾸고, 원래 값을 반환하는 함수예요. C++14에서 도입됐어요. <utility> 헤더에 있어요.
"읽고-바꾸기"를 한 번에 수행해요.
출처: cppreference
본문
// <utility> 헤더, C++14 (C++20부터 constexpr)
template< class T, class U = T >
T exchange( T& obj, U&& new_value );
obj의 값을 new_value로 교체하고, 이전 값을 반환해요.
사용 예
#include <utility>
int x = 42;
int old = std::exchange(x, 100); // old = 42, x = 100
이동 의미론과 함께
#include <utility>
#include <vector>
std::vector<int> v{1,2,3};
std::vector<int> old = std::exchange(v, {}); // v를 비우고, 이전 벡터를 old로
// old = {1,2,3}, v = {}
std::swap과 비슷하지만 이전 값을 돌려받는 점이 달라요. 명시적으로 이전 값을 이동해 "털어내는" 패턴에 유용해요.
RAII·소유권 이전
std::unique_ptr<int> p = std::make_unique<int>(5);
// p를 비우고 이전 포인터를 받아오기
std::unique_ptr<int> stolen = std::exchange(p, nullptr);
// stolen이 5를 소유, p는 null
특징
- constexpr(C++20) — 컴파일 타임에도 사용 가능.
- 조건부
noexcept. obj에new_value를 대입하고(이동/복사) 이전 값을 반환.
std::exchange는 "값을 교체하고 이전 값을 반환"하는 기본 원자적(의미론상) 도구로, 소유권 이전·상태 초기화·명시적 swap 구현에 널리 쓰여요.