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>:T와U타입의 값들이 어떤 조합으로든 서로 교환될 수 있는지 명세해요. 두 타입이 공통 참조를 가지며, 같은 타입끼리 및 혼합된 순서로 모두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]