move, 생성자, noexcept, forward의 역할
이동 시맨틱은 “값 범주를 표시하는 도구”와 “자원을 옮기는 함수”를 분리해서 읽어야 한다.
std::move이 객체를 이동 후보로 보겠다는 표시
move ctor포인터·핸들 같은 자원을 실제로 넘김
noexcept컨테이너가 복사 대신 이동을 고르게 함
std::forward받은 값 범주를 그대로 다음 호출에 전달
| 도구 | 맡는 일 | 자주 하는 실수 |
|---|---|---|
| std::move | rvalue처럼 다루게 캐스팅 | 그 자체로 복사 비용을 없앤다고 착각 |
| move 생성자 | 소유권을 가져오고 원본을 비움 | 원본 객체를 유효하지 않은 상태로 둠 |
| std::forward | 템플릿 인자의 lvalue/rvalue 보존 | 일반 함수에서 move 대신 사용 |
핵심 move는 “옮겨도 된다”는 신호이고, 실제 안전성은 이동 생성자와 noexcept 설계가 만든다.