1 분 소요

개요

exchange()는 주어진 값을 바꾸고 이전값을 리턴합니다.

기존에 이동 생성자와 이동 대입 연산자는 다음과 같이 구현됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Big {
    size_t m_Size;
    char* m_Ptr; // 크기가 큰 데이터

    Big(Big&& other) noexcept : 
        m_Size(other.m_Size),
        m_Ptr(other.m_Ptr) {

        other.m_Size = 0; // other는 0, nullptr로 초기화 됩니다.
        other.m_Ptr = nullptr;
    } 
    // 이동 대입 연산자. 우측값(rvalue) 이동
    Big& operator =(Big&& other) noexcept {
        delete[] m_Ptr; // 기존 것은 삭제하고,
        m_Size = other.m_Size; // other 것을 저장한뒤
        m_Ptr = other.m_Ptr;

        other.m_Size = 0; // other는 초기화 합니다.
        other.m_Ptr = nullptr;
        return *this;
    }   
};

exchange()를 사용하면 다음과 같이 좀 더 간소하게 작성할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Big_14 {
    size_t m_Size;
    char* m_Ptr; // 크기가 큰 데이터

    Big_14(Big_14&& other) noexcept : 
        m_Size{std::exchange(other.m_Size, 0)}, // other는 0, nullptr로 초기화 됩니다.
        m_Ptr{std::exchange(other.m_Ptr, nullptr)} {} 
    // 이동 대입 연산자. 우측값(rvalue) 이동
    Big_14& operator =(Big_14&& other) noexcept {
        delete[] m_Ptr; // 기존 것은 삭제하고,

        m_Size = std::exchange(other.m_Size, 0);  // other는 0, nullptr로 초기화 됩니다.
        m_Ptr = std::exchange(other.m_Ptr, nullptr);

        return *this;
    }   
};

태그:

카테고리:

업데이트:

댓글남기기