std:: swap
|
헤더에 정의됨
<algorithm>
|
(C++11 이전)
|
|
|
헤더에 정의됨
<utility>
|
(C++11 이후)
|
|
|
헤더에 정의됨
<string_view>
|
||
|
template
<
class
T
>
void swap ( T & a, T & b ) ; |
(1) |
(C++11부터 조건부 noexcept)
(C++20부터 constexpr) |
|
template
<
class
T2,
std::
size_t
N
>
void swap ( T2 ( & a ) [ N ] , T2 ( & b ) [ N ] ) ; |
(2) |
(C++11부터 조건부 noexcept)
(C++20부터 constexpr) |
주어진 값들을 교환합니다.
|
이 오버로드는 std:: is_move_constructible_v < T > && std:: is_move_assignable_v < T > 가 true 인 경우에만 오버로드 해결에 참여합니다. |
(since C++17) |
|
이 오버로드는 std:: is_swappable_v < T2 > 가 true 인 경우에만 오버로드 해결에 참여합니다. |
(C++17부터) |
목차 |
매개변수
| a, b | - | 교환될 값들 |
| 타입 요구사항 | ||
-
T
는 다음 요구사항을 충족해야 함
CopyConstructible
와
CopyAssignable
(C++11 이전)
MoveConstructible
와
MoveAssignable
(C++11 이후)
.
|
||
-
T2
는 다음 요구사항을 충족해야 함
Swappable
.
|
||
반환값
(없음)
예외
|
(없음) |
(C++11 이전) |
|
noexcept
명세:
noexcept
(
std::
is_nothrow_move_constructible
<
T
>
::
value
&&
|
(C++11 이후) |
|
noexcept
명세:
예외 명세에서 식별자
noexcept
(
noexcept
(
swap
(
*
a,
*
b
)
)
)
swap
에 대한 탐색은 일반적인 탐색 규칙으로 찾은 것에 추가로 이 함수 템플릿을 찾아, 예외 명세를 C++17
std::is_nothrow_swappable
와 동등하게 만듭니다.
|
(C++11부터)
(C++17까지) |
|
noexcept
명세:
noexcept
(
std::
is_nothrow_swappable_v
<
T2
>
)
|
(C++17부터) |
복잡도
특수화
|
|
(C++20 이전) |
프로그램 정의 타입을 교환 가능하게 만드는 예상 방법은 타입과 동일한 네임스페이스에서 비멤버 함수 swap을 제공하는 것입니다: 자세한 내용은 Swappable 을 참조하십시오.
다음 오버로드들은 표준 라이브러리에서 이미 제공됩니다:
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++20)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++23)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수) |
|
(C++11)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++14)
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++17)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++17)
|
std::swap
알고리즘을 특수화함
(함수) |
|
(C++17)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
std::swap
알고리즘을 특수화합니다
(함수 템플릿) |
|
|
(C++17)
|
std::swap
알고리즘을 특수화합니다
(함수) |
|
(C++23)
|
std::swap
알고리즘을 특수화합니다
(함수) |
|
(C++20)
|
std::swap
알고리즘을 특수화합니다
(함수) |
|
(C++23)
|
std::swap
알고리즘을 특수화합니다
(함수) |
|
(C++20)
|
std::swap
알고리즘을 특수화합니다
(함수) |
|
(C++20)
|
std::swap
알고리즘을 특수화합니다
(함수) |
예제
#include <algorithm> #include <iostream> namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream& operator<<(std::ostream& os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // 오류, 타입 요구사항이 충족되지 않음 swap(p, q); // OK, ADL이 적절한 friend `swap`을 찾음 std::cout << p << ' ' << q << '\n'; }
출력:
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 227 | C++98 |
T
가
CopyConstructible
또는
DefaultConstructible
을 요구하지 않음
(
T
타입의 임시 객체가 생성되지 않을 수 있음)
|
T
가
CopyConstructible 을 추가로 요구함 |
| LWG 809 | C++98 | 배열을 교환할 수 없었음 | 오버로드 (2) 추가됨 |
| LWG 2554 | C++11 |
다차원 배열 교환 시 이름 검색 문제로 인해
noexcept 가 될 수 없었음 |
동작하도록 수정됨 |
참고 항목
|
(C++20)
|
두 객체의 값을 교환
(커스터마이제이션 포인트 객체) |
|
두 반복자가 가리키는 요소를 교환
(함수 템플릿) |
|
|
두 요소 범위를 교환
(함수 템플릿) |
|
|
(C++14)
|
인수를 새 값으로 교체하고 이전 값을 반환
(함수 템플릿) |