Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代器需求中的明显不一致性_C++_C++11_Iterator - Fatal编程技术网

C++ 迭代器需求中的明显不一致性

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迭代器& 很

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

问题是基本迭代器要求(表106)是
*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
(这与值类型相反,如果从两个相同的值开始,并应用相同的操作,则结果是两个值保持相同的值(即仍然比较
==
)。