move_assignment — 이동 대입 연산자
move_assignment — 이동 대입 연산자
**이동 대입 연산자(move assignment operator)**는 이름이 operator=인 비템플릿 비정적 멤버 함수로, 같은 클래스 타입의 rvalue 인자로 호출되어 인자의 자원을 "이동"해요. C++11에서 도입됐어요.
a = std::move(b);처럼 이동 대입을 하면 b가 가진 자원을 a가 가져가고, b는 유효하지만 비워진 상태로 남아요. 복사 대입보다 훨씬 효율적이어서 자원 관리 클래스에서 중요해요.
출처: cppreference
본문
이동 대입 연산자는 같은 클래스 타입의 rvalue 인자로 호출될 수 있고, 인자를 수정하지 않고 그 내용을 이동하는 대입 연산자예요.
문법 (Syntax)
return-type operator=( parameter-list ) ;
return-type operator=( parameter-list ) function-body
return-type operator=( single-rvalue-reference-parameter-list ) = default;
return-type operator=( parameter-list ) = delete;
parameter-list— 하나의 매개변수만 가진 매개변수 목록. 타입은T&&,const T&&,volatile T&&,const volatile T&&return-type— 어떤 타입이든 가능하지만 체이닝을 위해T&가 선호돼요.
설명 (Explanation)
이동 대입 연산자는 과부하 해석에 따라 rvalue가 대입 표현식의 왼쪽(실제로는 오른쪽 피연산자)에 나타날 때 선택돼요. 예를 들어 a = std::move(b);에서 b가 이동 원본이 돼요.
암시적으로 선언된 이동 대입 연산자
클래스에 사용자 선언 이동 대입 연산자가 없으면, 다음 조건을 모두 만족할 때 컴파일러가 선언해요.
- 사용자 선언 복사 생성자 없음
- 사용자 선언 이동 생성자, 복사 대입, 소멸자 없음
암시적으로 정의된 이동 대입 연산자
암시적으로 선언된 이동 대입 연산자가 삭제되지 않았다면 ODR-사용될 때 컴파일러가 정의해요. 유니언은 객체 표현을 이동 복사하고, 비유니온 클래스는 기반과 멤버를 각각의 이동 대입 연산자로 이동 대입해요(없으면 복사 대입).
삭제된 이동 대입 연산자
특정 조건(예: const/참조 타입 멤버, 삭제된 부분 객체의 이동 대입 등)에서 삭제된 것으로 정의돼요.
Trivial 이동 대입 연산자
사용자 제공이 아니고, 가상 멤버·가상 기반이 없고, 각 기반과 멤버의 이동/복사 대입이 trivial이면 trivial이에요.
노트 (Notes)
이동 대입 후, 이전 *this가 가진 자원은 소멸자나 리셋으로 해제돼야 하고, 이동된-from 객체는 유효하지만 지정되지 않은 상태로 두는 것이 일반적인 규약이에요. 이동 대입 연산자를 명시적으로 삭제하면 복사 대입만 사용돼요.