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
   22   23   24   25   26   27   28   29   30   31