2016-12-19 1 views
1

SGI STL의 반복자 특징을 학습 할 때 문제가 있습니다.value_type 함수가 SGI STL에서 포인터를 반환하는 이유

이 함수는 반복기의 유형을 가져 오는 함수입니다.

template <class Iterator> 
inline typename iterator_traits<Iterator>::value_type* value_type(const Iterator&){ 
    return static_cast<typename iterator_traits<Iterator>::value_type*>(0); 
} 

그리고 이것은 내가 value_type 기능 value_type* 대신 value_type을 반환하는 이유를 궁금해 value_type

template <class ForwardIterator, class T> 
inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x){ 
     __uninitialized_fill(first,last,x,value_type(first)); 
} 

template <class ForwardIterator, class T, class T1> 
inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*){ 
     typedef typename __type_traits<T1>::is_POD_type is_POD; 
     __uninitialized_fill_aux(first, last, x, is_POD()); 
} 

를 호출하는 기능입니다, 그 이유를 알아낼 수 없습니다. 제 생각에는 두 가지 해결책 모두 괜찮을 것으로 보입니다.

누군가가 나를 도울 수 있기를 바랍니다. 감사합니다.

답변

2

은 내가 value_type 기능 value_type* 대신 value_type, 나는 이유를 알아낼 수 없습니다 반환하는 이유를 궁금해. 제 생각에는 두 가지 해결책 모두 괜찮을 것으로 보입니다.

uninitialized_fill에는 해당 매개 변수의 이름이 지정되지 않습니다. 우리는 그 타입을 필요로하고 오버 헤드가 발생하기를 원하지 않습니다.

임의 유형의 경우 T에 대해 우리는 그것을 구성하는 방법이나 복사 가능하거나 이동 가능한지 여부를 알지 못합니다. 따라서 value_type을 직접 전달하는 것은 불가능할 수 있으며 부적절한 사본을 부 풀릴 수있는 부작용이 발생할 수 있습니다. 그러나 0에서 T*을 만들 수 있는지는 확실합니다. 따라서 value_type에 0으로 초기화 된 포인터를 사용하는 것이이 상황에서 편리한 해킹입니다.

SGI의 구현은 정말 오래된 심지어 C++ 98을 간직한, 그래서 표준 라이브러리의 현대 구현에서 보라는 권유를한다고

참고.

+0

+1 템플릿 매개 변수를 재정렬하고 방금 '__uninitialized_fill :: value_type> (first, last, x);로 호출했을 때 왜이 해킹 된 솔루션을 사용했는지 궁금합니다. –

+0

어떤 구현을 살펴 봐야할지 모르겠다. 구현 버전을 권해 주시겠습니까? – Jiahao

+0

@Pyjamas는'libC++'또는'libstdC++'프로젝트를 찾는다 –

관련 문제