我正在实现一些类型特征/概念类来检查传递给泛型函数的类型是否满足迭代器类型的编译时要求(在标准中定义,从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*()
得到的类型之间的不一致(以及标准库中的一堆其他输出迭代器) )。
答案 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
代表你不能读,但我想它可以改进。