C++ C++;标准库禁止非标准迭代器类别?
clang(使用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
-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;
};