C++의 perfect forwarding에 관해서 글을 읽던중에 이해가 가지 않아서요~
글쓴이: greathero / 작성시간: 목, 2013/04/04 - 7:07오후
지금 보고 있는 글의 일부를 잠시 발췌해왔습니다.
발췌시 제약사항은 없어서 괜찮을 것 같구요.
글을 한번 봐주세요.
이동 시맨틱과는 별개로 r-value 레퍼런스는 완벽한 전달(perfect forwarding) 문제를 해결하기 위해서 만들어졌습니다. 아래와 같은 간단한 팩토리 함수를 생각해 봅시다. template<typename T, typename Arg> shared_ptr<T> factory(Arg arg) { return shared_ptr<T>(new T(arg)); } 보시다시피 이 예제의 의도는 팩토리 함수의 인수로 주어진 arg를 T의 생성자로 전달하는 것입니다. arg의 입장에서 보면 마치 팩토리 함수가 존재하지 않았고 생성자를 상위에서 직접 호출한 것처럼 행동하는 것이 이상적이겠죠. 이것이 완벽한 전달입니다.
위의 글에서
이것이 완벽한 전달입니다.> 라는 부분이 해석이 되질 않네요.
이 문장이 무슨 뜻인지를 모르겠어요. "생성자를 상위에서 직접 호출한 것처럼" 이라는 부분이 특히나 와닿질 않네요.
이해하신 분 있으시면 댓글로 풀어서 설명해주시면 정말 감사할 듯 합니다~
아니면 좀 더 쉽게 perfect forwarding에 대해 말씀해 주실 수 있는 분이 있으면 설명 좀 부탁드려요~
Forums:
다음과 같은 클래스가 있다고
다음과 같은 클래스가 있다고 가정합니다.
그럼 다음과 같이 수행했을 때, l-value reference 생성자와 r-value reference 생성자가 바르게 호출됨을 확인할 수 있습니다.
이 경우 std::shared_ptr를 생성하는 함수를 만든다고 할 때, 다음과 같은 함수만을 이용했을 시에는 r-value reference생성자가 정상적으로 호출되지 않습니다.
따라서 다음과 같이 r-value reference를 인자로 받는 make 함수를 오버로딩해주어야합니다.
위에서 정의한 value 클래스는 인자를 1개만 받도록 되어있지만, 만약 인자를 2개 이상 받게 된다면 각각의 인자에 대해 l-value, r-value reference의 모든 조합에 대해 make함수를 오버로딩해주어야합니다.
perfect forwarding을 이용하면 make 함수의 인자를 value 생성자로 직접적으로 전달할 수 있게 됩니다.
다음과 같은 코드를 통해 실제로 올바른 생성자가 선택되어 호출됨을 확인할 수 있습니다.
오오! 완전 이해되었습니다!
깔끔한 소스와 명쾌한 설명 감사합니다 ㅎㅎㅎㅎ
댓글 달기