2014-08-27 2 views
2

T aT b이 있고 std::swap(a, b)을 호출하는 경우 호출되는 생성자, 할당 연산자 및 소멸자의 순서는 무엇입니까? T에 대한 전문성이없는 경우std :: swap은 생성자, 할당 연산자 및 소멸자와 관련하여 어떻게 작동합니까?

+1

'T'가 무엇인가에 달려 있습니다. – quantdev

+0

어떻게 그렇게됩니까? 어떤 유형의'T'라는 두 개의 일반 객체를 교환하는 데 사용되는 표준 방법이 없습니까? – roscioli

+1

나는 많은 전문화가있을 수 있으며, 아마도 사용자 정의 된 전문화가 가능하다는 것을 의미했다. – quantdev

답변

4

"필수"인 특정 순서는 없으며, 모두 사용중인 표준 라이브러리가 제공하는 구현에 따라 달라집니다.

std::swap의 C++ 03의 변화는 다음과 같습니다

template<typename T> 
void swap(T& a, T& b) { 
    T temp(a); // copy 
    a = b;  // assign 
    b = temp; // assign 
} 

C++ (11)의 구현은 다음과 같습니다 등

template<typename T> 
void swap(T& a, T& b) { 
    T temp = std::move(a); // move copy or normal copy (moves if moveable) 
    a = std::move(b);  // move or assign 
    b = std::move(temp); // move or assign 
} 

여러 std 용기 swap에 전문 않는 그들이 할 수 있기 때문에 보다 우수하거나 효율적인 구현을 제공한다. 사용자 정의 유형이 동일하게 수행 할 수 있습니다. 이러한 전문 분야에서는 더 많은 변형이 발생할 수 있거나 발생할 수 있습니다.

3

, 다음 일반 버전은 더 함께 등 내부 포인터를 교환한다 전문화가있을 수 있습니다 (예 : 용기 등)

{ 
    T t = std::move(a); // move construction 
    a = std::move(b); // move assignment 
    b = std::move(t); // move assignment 
}      // destruction of t 

일부 유형의 라인을 따라 뭔가를 할 것 임시 오브젝트 및 오브젝트 지정 없음.