std::swappable

std::swappable (swap 가능 개념)

두 값이 서로 교환(swap)될 수 있는지를 명세하는 개념(concept)이에요. std::swap이 올바르게 사용될 수 있는지를 검사해요. C++20부터 있어요.

출처: cppreference

본문

<concepts> 헤더에 정의돼 있고, std::swap과 관련해 두 값이 교환 가능한지 판정하는 개념들이에요.

template< class T >
concept swappable = requires(T& a, T& b) {
    ranges::swap(a, b);
};

template< class T, class U >
concept swappable_with =
    std::common_reference_with<T, U> &&
    requires(T&& t, U&& u) {
        ranges::swap(std::forward<T>(t), std::forward<T>(t));
        ranges::swap(std::forward<U>(u), std::forward<U>(u));
        ranges::swap(std::forward<T>(t), std::forward<U>(u));
        ranges::swap(std::forward<U>(u), std::forward<T>(t));
    };
  • swappable<T>: T 타입의 두 값이 std::ranges::swap으로 교환될 수 있는지 명세해요.
  • swappable_with<T, U>: TU 타입의 값들이 어떤 조합으로든 서로 교환될 수 있는지 명세해요. 두 타입이 공통 참조를 가지며, 같은 타입끼리 및 혼합된 순서로 모두 swap이 가능해야 해요.

swap은 예외를 던져선 안 되고(noexcept), 교환 후에는 각 객체가 원래 다른 객체가 보유하던 값이 되도록 동작해야 해요. ADL swap이나 std::swap 특수화가 사용될 수 있어요.

movable, copyable 같은 객체 개념들이 swappable을 전제 조건으로 요구해요. 두 객체의 값을 저렴하게 맞바꾸는 일반적인 제네릭 코드에서 흔히 쓰여요.

참고 문헌

  • C++23 표준 (ISO/IEC 14882:2024): 18.4.15 Concept swappable [concept.swappable]
  • C++20 표준 (ISO/IEC 14882:2020): 18.4.15 Concept swappable [concept.swappable]

더 알아보기 (Learn more)

cppreference