-
항목25. 오른값 참조에는 std::move를, 보편 참조에는 std::forward를 사용하라Effective Modern C++ 2022. 8. 27. 14:47
class Widget{ Widget(Widget&& rhs) // rhs는 오른값 참조 : name(std::move(rhs.name)),p(std::move(rhs.p)) {...} ... } class Widget2{ template<typname T> void setName(T&& newName) // newName은 보편 참조 { name = std::forward<T>(newName); } ... }오른값 참조 -> 오른값으로의 무조건 캐스팅을 적용해야 한다.(std::move를 통해서)
보편 참조 -> 오른값으로의조건부 캐스팅을 적용해야 한다.(std::forward를 통해서)
반환값 최적화 : 복사 버전에서, 만일 지역 변수 w를 함수의 반환값 을 위해 마련한 메모리 안에 생성한다면 w의 복사를 피할 수 있다. (=> 이 경우 std::move()나 std::forward() 사용하지마!)
복사를 제거할 수 있는 경우 (반환값 최적화)
- 그 지역 객체의 형식이 함수의 반환 형식과 같아야 한다.
- 그 지역 객체가 바로 함수의 반환값이어야 한다. (값 전달 방식 반환)
Widget makeWidget() // 복사 버전 { Widget w; ... return w; // 1. 복사 제거로 인해 복사를 피함. } // 2. 복사 제거를 수행하지 않을 때에는 w를 // 오른값으로 취급. 즉 return std::move(w);Widget makeWidget(Widget w) // 함수의 반환값과 형식이 같은, { // 값 전달 방식의 매개변수 ... return w; // w를 오른값으로 취급한다 } // return std::move(w); 로 취급'Effective Modern C++' 카테고리의 다른 글
항목27. 보편 참조에 대한 중복적재 대신 사용할 수 있는 기법들을 알아 두라 (0) 2022.09.06 항목26. 보편 참조에 대한 중복적재를 피하라 (0) 2022.09.06 항목24. 보편 참조와 오른값 참조를 구별하라 (0) 2022.08.27 항목23. std::move와 std::forward를 숙지하라 (0) 2022.08.20 항목22. Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라 (0) 2022.08.16