네임 스페이스에 선언을 추가하는 것은 일반적으로 정의되지 않은 동작 이기 때문에 (2) ( 사용자 정의 클래스가 선언 된 동일한 네임 스페이스에있는 독립형swap
) 은 사용자 정의 클래스 를 제공 할 수있는 유일한 방법 인 것 같습니다 . 네임 스페이스 std (cppreference.com) 확장 :swap
std
네임 스페이스 std
또는에 중첩 된 네임 스페이스에 선언 또는 정의를 추가하는 것은 정의되지 않은 동작이며 std
아래에 몇 가지 예외가 있습니다.
그리고 swap
이러한 예외 중 하나로 표시되지 않습니다. 따라서 네임 스페이스에 자체 swap
오버로드를 추가 std
하는 것은 정의되지 않은 동작입니다.
또한 표준 라이브러리는 이러한 사용자 정의 가 제공되는 경우 사용자 클래스에 대해 사용자 swap
정의를 호출하기 위해 함수에 대한 정규화되지 않은 호출을 사용한다고합니다 .swap
swap
스왑 가능 (cppreference.com) :
많은 표준 라이브러리 함수 (예 : 많은 알고리즘)는 인수가 Swappable 을 만족할 것으로 예상합니다. 즉, 표준 라이브러리가 스왑을 수행 할 때마다 using std::swap; swap(t, u);
.
스왑 (www.cplusplus.com) :
(내 표준 라이브러리의 많은 구성 요소 std
호출) swap
에서 비정규 의 사용자 정의 오버로드 : 방식이 아닌 기본 유형의 사용자 정의 오버로드 대신 일반 버전의 호출 할 수 있도록 swap
그들이 선택받을 제공되는 유형과 같은 네임 스페이스 선언을 를 통해 인수 의존 검색 이 일반 버전 이상.
그러나 std::swap
사용자 정의 클래스에 대한 함수를 직접 사용하면 사용자 정의 std::swap
대신 일반 버전이 호출 됩니다 swap
.
my::object a, b;
std::swap(a, b); // calls std::swap, not my::swap
따라서 swap
표준 라이브러리에서 수행되는 것과 동일한 방식으로 사용자 코드에서 함수 를 호출하는 것이 좋습니다 .
my::object a, b;
using std::swap;
swap(a, b); // calls my::swap if it is defined, or std::swap if it is not.