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.
  • objnew_value를 대입하고(이동/복사) 이전 값을 반환.

std::exchange는 "값을 교체하고 이전 값을 반환"하는 기본 원자적(의미론상) 도구로, 소유권 이전·상태 초기화·명시적 swap 구현에 널리 쓰여요.

더 알아보기 (Learn more)

cppreference