C++ 迭代器需求中的明显不一致性
我正在实现一些类型特征/概念类,以检查传递给泛型函数的类型是否满足迭代器类型的编译时要求(如标准中定义的,从24.2.2开始) 问题是基本迭代器要求(表106)是C++ 迭代器需求中的明显不一致性,c++,c++11,iterator,C++,C++11,Iterator,我正在实现一些类型特征/概念类,以检查传递给泛型函数的类型是否满足迭代器类型的编译时要求(如标准中定义的,从24.2.2开始) 问题是基本迭代器要求(表106)是*r的类型(其中r是对T类型迭代器的引用)是std::iterator\u traits::reference。但是,如果我们考虑一个输出迭代器,例如 STD::OrthuryTyror < /C> >, 我们可以看到在这种情况下,reference类型是void,而迭代器类型的操作符*()返回std::ostream\u迭代器& 很
*r
的类型(其中r
是对T
类型迭代器的引用)是std::iterator\u traits::reference
。但是,如果我们考虑一个输出迭代器,例如<代码> STD::OrthuryTyror < /C> >,
我们可以看到在这种情况下,reference
类型是void
,而迭代器类型的操作符*()
返回std::ostream\u迭代器&
很明显,我误解了一些事情,但我看不出是什么?它是否与输出迭代器只能在赋值的左侧取消引用这一事实有关
编辑:我想澄清一下,我的问题是关于引用类型和调用
std::ostream_迭代器(以及标准库中的一组其他输出迭代器)上的operator*()
导致的类型之间的不一致性。24.2.1[迭代器.要求.概述]/11
在以下章节中,a和b表示类型X或常数X的值,
类型和参考的区别是指类型
迭代器特征::差异类型和
迭代器_traits::reference,分别为
reference
不是allocator\u traits::reference
,而是iterator\u traits::reference
现在,在标准std::ostream_迭代器中定义为:
class ostream_iterator:
public iterator<output_iterator_tag, void, void, void, void> {
类ostream\u迭代器:
公共迭代器{
std::iterator
模板的最后一个参数是引用类型,这意味着对于std::ostream\u iterator
,要求iterator\u traits::reference
为void
同时,24.2.1/1要求:
[…]所有输出迭代器都支持表达式*i=o,其中o是可写入特定迭代器类型i的类型集中的某个类型的值。[…]
这可能是你缺少的保证作业有效的部分。我想参考
是无效
某种程度上表示你无法读出这一点,但我想它可以改进。好吧*r
不是参考
(不是无效
)对于输出迭代器,所以这个需求是不满足的(如果它是一个需求的话)。是的,但令人困惑的是,输出迭代器应该是迭代器概念的细化,对于它,引用不能无效(因为根据通用迭代器需求,它必须是*r
类型).EDIT:what@dyp说的。@dyp:reference在这两个要求上存在矛盾。如果*i
的类型是void
,则无法从适当的类型中进行分配,如果可以分配,则不能void
。可能需要一个DR…可能需要reference
是std::ostream\u迭代器
。@bluescarni:输入和输出迭代器是特殊的野兽。所有其他迭代器都是相关的,但不是这两个。要求可能是错误的,但假设输入和输出迭代器是迭代器,其方式与前向、双向、随机迭代器相同……这会让您陷入麻烦:)@Bluescani:不,没有OOP类型的层次结构。例如,输入和输出迭代器都是单通迭代器。相等的定义是,与任何关于两个值的相等应该是什么的常识定义相反:a==b
并不意味着++a==b
(这与值类型相反,如果从两个相同的值开始,并应用相同的操作,则结果是两个值保持相同的值(即仍然比较==
)。