C++ 关于迭代器类的正确定义

C++ 关于迭代器类的正确定义,c++,iterator,c++14,C++,Iterator,C++14,这是一个定义良好的迭代器吗 struct my_iterator { struct iterator_category : std::bidirectional_iterator_tag, std::output_iterator_tag {}; // rest of implementation. Assume it correctly models // the output and bidir

这是一个定义良好的迭代器吗

struct my_iterator
{
    struct iterator_category : std::bidirectional_iterator_tag,
                               std::output_iterator_tag
    {};

    // rest of implementation. Assume it correctly models 
    // the output and bidirectional iterator requirements.
};
我在不同的地方读到,内部的
iterator_类别
必须是其中一个标准iterator类别标记的别名(
typedef
/
),但标准确切地说是(C++14/N3797):

[std.iterator.tags]/1对于迭代器类型的每个迭代器,
iterator\u traits::iterator\u category
应定义为 描述迭代器行为的最具体的类别标记

它并没有严格地说它必须是一个别名,但它必须是其中之一,因为继承毕竟定义了一个is-a关系

因为在不允许的情况下,
boost::iterator\u facade
将定义无效的迭代器(在某些情况下,它使用继承来定义组合的类别/遍历标记)

如果允许的话,该标准是否应该对
迭代器\u category
类型施加一些进一步的要求,以帮助实现了解他们对内部类型的期望


例如,
iterator\u category
不是默认可构造的,该怎么办?实现不能利用函数重载来选择最佳算法实现,不能严格使用模板专门化和
std::is_base\u of
和排序,从而强制执行更详细的实现。

继承可能不会造成问题。但是多重继承会给你带来很多模棱两可的东西。这就是为什么建议使用别名。@StoryTeller阅读添加的注释。问题其实不是继承,问题是,
iterator\u category
s将是没有要求的用户定义类型。这是不允许的,但人们无论如何都会这样做,所以实现尝试适应这样的代码。@T.C.所以我们可以说,
boost::iterator\u facade
在某些引用下不符合标准,值\类型和类别模板参数组合。