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 객체는 유효하지만 지정되지 않은 상태로 두는 것이 일반적인 규약이에요. 이동 대입 연산자를 명시적으로 삭제하면 복사 대입만 사용돼요.

더 알아보기 (Learn more)

cppreference