Page 27 -
P. 27
이렇다. std::move를 사용하면 컴파일러는 소스(arg)를 우측값 참조(rvalue reference)로 변환한다
(static_cast<std::remove_reference<decltype(arg)>::type&&>(arg)). 컴파일러가 이동 의미론
을 적용할 수 없다면 복제 의미론(copy semantics)을 적용한다.
2
#include <utility>
... 유틸리티
std::vector<int> myBigVec(10000000, 2011);
std::vector<int> myVec;
myVec = myBigVec; // 복제 의미론
myVec = std::move(myBigVec); // 이동 의미론
Tip 이동이 복제보다 가볍다
이동 의미론은 두 가지 면에서 유리하다. 첫째, 복제보다 이동이 훨씬 가볍다. 다시 말해, 메모리를 할당했다가 해제하
는 번거로운 작업이 필요 없다. 둘째, 스레드나 락처럼 복제할 수 없는 오브젝트에 적용할 수 있다.
2.1.3 std::forward
5
<utility>에 정의된 std::forward 함수 를 이용하면 주어진 인수를 그대로 전달하는 함수 템플
릿을 작성할 수 있다. std::forward는 팩토리 함수(factory function)나 생성자(constructor)를 만드
는 데 주로 활용한다. 팩토리 함수는 오브젝트를 생성하는 함수로서 주어진 인수를 그대로 전달
한다. 생성자는 대체로 베이스(기본) 클래스의 필드 값을 초기화하는 데 주로 사용한다. 그래서
std::forward는 제네릭 라이브러리를 제작하는 데 적합하다.
완벽 전달(perfect forwarding)
// forward.cpp
...
#include <utility>
…
struct MyData{
MyData(){};
MyData(int, double, char){};
};
5 http://en.cppreference.com/w/cpp/utility/forward
43
c++_06.indd 43 2021-11-19 오전 9:25:44