2017-11-27 15 views
4

을 iterator_traits표준은 :: 감안하면 libstdC++ 간의 차이와의 libC++

error: no member named ' iterator_category ' in ' std::__1::iterator_traits<Iter> ' std::is_same<std::iterator_traits<Iter>::iterator_category, Iter::iterator_category>::value, "");

Iter::iterator_category이 표준 입력 범주 중 하나 인 경우 정적 어설 션이 성공합니다 예를 들어 std::input_iterator_tag.

이럴

가 실패하지해야하기 때문에 [iterator.traits]#2에서 C++ 초안 상태 :

If Iterator has valid ([temp.deduct]) member types difference_­type , value_­type , pointer , reference , and iterator_­category , iterator_­traits<Iterator> shall have the following as publicly accessible members:

using difference_type = typename Iterator::difference_type; 
using value_type  = typename Iterator::value_type; 
using pointer   = typename Iterator::pointer; 
using reference   = typename Iterator::reference; 
using iterator_category = typename Iterator::iterator_category; 

Otherwise, iterator_­traits<Iterator> shall have no members by any of the above names.

아무도이 구현 버그인지, 또는 내 기대가 잘못된 이유를 설명시겠습니까?

+1

표준을 해석 할 때 iterator_cathegory의 유일한 유효한 유형은 input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag 및 random_access_iterator_tag입니다. iterator_cathegory에 다른 값이있는 경우, iterator에는 유효한 iterator_cathegory 유형이 없으므로이 반복자에 대한 iterator_traits에는 지정된 구성원이 없어야합니다. – Johan

답변

2

우리는 또한 [std.iterator.tags]에 있습니다

It is often desirable for a function template specialization to find out what is the most specific category of its iterator argument, so that the function can select the most efficient algorithm at compile time. To facilitate this, the library introduces category tag classes which are used as compile time tags for algorithm selection. They are: input_­iterator_­tag , output_­iterator_­tag , forward_­iterator_­tag , bidirectional_­iterator_­tag and random_­acces_­iterator_­tag . For every iterator of type Iterator , iterator_­traits<Iterator>​::​iterator_­category shall be defined to be the most specific category tag that describes the iterator's behavior.

namespace std { 
    struct input_iterator_tag { }; 
    struct output_iterator_tag { }; 
    struct forward_iterator_tag: public input_iterator_tag { }; 
    struct bidirectional_iterator_tag: public forward_iterator_tag { }; 
    struct random_access_iterator_tag: public bidirectional_iterator_tag { }; 
} 

int 그래서 iterator_traits<Iter>::iterator_category 당신에게 다시 int을 줄 수, 해당 태그 중 하나가 아닙니다. 유효하지 않은 반복자 카테고리를 사용하면 단순히 iterator_traits의 전제 조건을 위반하는 것입니다. 이는 반드시 라이브러리가 실패해야 함을 의미하지는 않지만 실패가 라이브러리 버그임을 의미하지는 않습니다.

그러나 이러한 전제 조건은 [반복기]에서 명시 적으로 라이브러리 섹션의 다른 부분과 동일하게 철자되지 않습니다. 그래서 두 라이브러리가 맞다고 제안 하겠지만, iterator_traits<Iter>에서 멤버 별칭을 정의하지 않는 libC++의 접근 방식이 더 좋을 것입니다.