C++ C++;标准库禁止非标准迭代器类别?

C++ C++;标准库禁止非标准迭代器类别?,c++,iterator,C++,Iterator,clang(使用-stdlib=libc++)拒绝创建用户定义迭代器类别标记的以下程序,但其他编译器和标准库实现不拒绝该程序: #include <iterator> struct my_iterator_tag {}; struct my_iterator : std::iterator<my_iterator_tag, int> {}; int main() { std::iterator_traits<my_iterator>::value_t

clang(使用
-stdlib=libc++
)拒绝创建用户定义迭代器类别标记的以下程序,但其他编译器和标准库实现不拒绝该程序:

#include <iterator>

struct my_iterator_tag {};

struct my_iterator : std::iterator<my_iterator_tag, int> {};

int main()
{
  std::iterator_traits<my_iterator>::value_type x;
  return 0;
}

std::iterator
模板定义如下:

template<class Category, class T, class Distance = ptrdiff_t,
    class Pointer = T*, class Reference = T&> struct iterator {
    typedef T value_type;
    typedef Distance difference_type;
    typedef Pointer pointer;
    typedef Reference reference;
    typedef Category iterator_category;
  };
}
看不出有什么不对。这是一份有效的声明

现在,让我们来看看<代码>迭代器特性> <代码>:

template<class Iterator> struct iterator_traits {
   typedef typename Iterator::difference_type difference_type;
   typedef typename Iterator::value_type value_type;
   typedef typename Iterator::pointer pointer;
   typedef typename Iterator::reference reference;
   typedef typename Iterator::iterator_category iterator_category;
};
模板结构迭代器{
typedef typename迭代器::差分类型差分类型;
typedef typename迭代器::value_type value_type;
typedef typename迭代器::指针;
typedef typename迭代器::引用引用;
typedef typename迭代器::迭代器\类别迭代器\类别;
};
将此模板应用于
my_Iterator
迭代器
,我也没有发现任何技术错误。这些模板的上述定义直接来自标准。因此,就C++11标准中这些模板的实际严格的文字声明而言,我认为这些声明没有任何错误

<> C++标准当然定义了五个标准迭代器类,因此,对于C++库的其余部分,有必要进一步分析。我想,像迭代器适配器这样的各种东西可能都是未定义的行为,除了五个标准迭代器类别之外

粗略地看,我找不到任何东西明确指出,除了使用带有
std::iterator
std::iterator_traits
的五个预定义标记之外,使用任何其他标记都是未定义的行为,因此仅在这个有限的示例中,我认为这在技术上是有效的,尽管它的价值可疑

struct my_iterator : std::iterator<my_iterator_tag, int> {};
struct my_iterator {

    // ...

    typedef Category my_iterator_tag;

    // ...
};
template<class Iterator> struct iterator_traits {
   typedef typename Iterator::difference_type difference_type;
   typedef typename Iterator::value_type value_type;
   typedef typename Iterator::pointer pointer;
   typedef typename Iterator::reference reference;
   typedef typename Iterator::iterator_category iterator_category;
};