2011-09-11 4 views
4

C++ 11에서는 불필요하게 개체를 복사하지 않도록하는 방법을 소개하고 그렇지 않으면 복사 할 때 해당 의미를 적용하기 위해 std::move을 도입합니다. 그러나 사본이 필요한 경우도 있지만 기본값은 아닌 경우도 있습니다.누락 된 단항 std :: copy 최적의 구현

예를 들어 reverse의 순진 구현을 고려하십시오. 범위 기반 for은 완벽한 전달을 사용하므로 루프 내의 컨테이너를 수정하면 손상 될 수 있습니다.

auto out_iter = container.rbegin(); 
for (auto value : container) { 
    * out_iter ++ = value; 
} 

목표는 ... 그것은 간단한데이 사용

for (auto value : copy(container)) { 

를 해결할 어떤 주장을 수용, 기본 유형을 얻고 임시 복사본을 반환하는 것입니다.

+0

EDSL 람다 라이브러리에'에 대한 참조를 전달 ref' (). –

답변

8

계산중인 반환 유형을 typename std::decay<T>::type이라고하면 더 잘 알려져 있습니다. 그 외에는, 완벽한 전달의 이점 누릴 본문에 std::forward을 사용 반대 일반적으로,이 기능`val` 이름을 Boost.Phoenix 같은

template<typename T> 
typename std::decay<T>::type 
val(T&& t) 
{ return std::forward<T>(t); } 
+2

아주 좋습니다! 완벽한 포워딩도 rvalue를 그대로 통과시키는 효과가 있으므로 'val (move (x))'와 'val (X())'는 실제로 사본을 가져 오지 않습니다. 이것은이 기능을 나의 것과 구별되게 (그리고 우월한) 다른 이름을 가질만한 가치가있게합니다. – Potatoswatter