迭代器要求中的表观不一致

时间:2014-05-09 14:33:36

标签: c++ c++11 iterator

我正在实现一些类型特征/概念类来检查传递给泛型函数的类型是否满足迭代器类型的编译时要求(在标准中定义,从24.2.2开始)。

问题是基本迭代器要求(表106)是*r的类型(其中r是对T类型的迭代器的引用)是{{1 }}。但是,如果我们考虑输出迭代器,例如std::iterator_traits<T>::reference

http://en.cppreference.com/w/cpp/iterator/ostream_iterator

我们可以看到在这种情况下std::ostream_iterator类型是reference,而迭代器类型的void返回operator*()

显然,我在这里误解了一些东西,但我看不清楚什么?是否与输出迭代器只能在赋值的左侧取消引用这一事实有什么关系呢?

编辑:我想澄清一下我的问题是关于引用类型与在std::ostream_iterator &上调用operator*()得到的类型之间的不一致(以及标准库中的一堆其他输出迭代器) )。

1 个答案:

答案 0 :(得分:2)

24.2.1 [iterator.requirements.general] / 11

  

在以下部分中,a和b表示X或const X的值,   difference_type和reference指的是类型   iterator_traits :: difference_type和   iterator_traits :: reference,分别为

reference不是allocator_traits<T>::reference,而是iterator_traits<T>::reference

现在,标准std::ostream_iterator<T>定义为:

class ostream_iterator:
                   public iterator<output_iterator_tag, void, void, void, void> {

std::iterator模板的最后一个参数是引用类型,这意味着iterator_traits<T>::reference需要void std::ostream_iterator<T>

同时,24.2.1 / 1要求:

  

[...]所有输出迭代器都支持表达式* i = o其中o是某些类型的值,该类型在可写入特定迭代器类型i的类型集中。 [...]

这可能是您缺少的部分,可以保证分配的有效性。我想reference void代表你不能,但我想它可以改进。