这是一个定义明确的迭代器吗?
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
以及排序,从而强制实现更详细的实现。