关于iterator_category

时间:2017-09-28 18:36:38

标签: 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 bidirectional iterator requirements.
};

我在不同的地方读过内部iterator_category必须是一个标准迭代器类别标签的别名(typedef / using),但标准确切地说(C ++ 14 / N3797):

  

[std.iterator.tags] / 1 对于Iterator类型的每个迭代器,iterator_traits<Iterator>::iterator_category应定义为   描述迭代器行为的最具体的类别标记。

它并不是说必须严格来说是别名,而是它必须 其中之一,因为继承定义了 is-a

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

如果允许,标准不应该对iterator_category类型强加一些进一步的要求,以帮助实现知道他们对内部类型的期望是什么?

例如,如果iterator_category不是默认可构造的,该怎么办?实现无法使用函数重载来选择最佳算法实现,并严格使用模板特化和std::is_base_of以及排序,从而强制实现更详细的实现。

0 个答案:

没有答案