をにiterator_traitsのstdは::考えるの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
が標準入力カテゴリの1つである場合、静的アサーションは成功します。例えば、 std::input_iterator_tag
。
それが失敗してはならない、なぜなら[iterator.traits]#2でC++のドラフト状態:
If Iterator has valid ([temp.deduct]) member types
difference_type
,value_type
,pointer
,reference
, anditerator_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.
は誰もが、これは実装のバグであるかどうか、または私の期待が間違っている理由を説明していただけますか?
私が標準を解釈するので、iterator_cathegoryの唯一の有効なタイプは、input_iterator_tag、output_iterator_tag、forward_iterator_tag、 bidirectional_iterator_tagおよびrandom_access_iterator_tagです。 iterator_cathegoryに別の値がある場合、イテレーターは有効なiterator_cathegoryタイプを持たないため、このイテレーターのiterator_traitsは指定されたメンバーを持たないものとします。 – Johan