我正在实现一个迭代器,它迭代生成器函数的结果,而不是内存中的数据结构,如向量或Map。
通过阅读final working draft for C++17 §27.2.3,输入迭代器(以及扩展到大多数其他迭代器)a forward iterator的解引用操作符的返回类型必须是引用。对于迭代器正在迭代的数据结构中存在的项,这是很好的。然而,因为我没有使用数据结构,并且在调用解引用操作符时计算每一项,所以我没有要返回的有效引用;当操作员返回时,计算项被销毁。为了解决这个问题,我将计算结果存储在迭代器本身中,并返回对存储结果的引用。这对于我的用例来说很好用,但是当与任意用户定义的类型一起使用时,它有自己的问题。
我可以理解迭代器被允许返回一个引用,但为什么这是非可变迭代器的要求呢?标准的作者没有考虑生成器和动态转换是迭代器的有效用例吗?返回一个值而不是一个常量引用会造成任何实际的伤害吗?
[edit]:我问更多的是出于好奇,为什么标准是这样写的,因为我已经有了一个非常好的解决方案。
2条答案
按热度按时间lfapxunr1#
解引用输入迭代器是 * 不 * 需要产生一个glvalue(即返回一个引用)。输入迭代器要求解引用时的返回类型必须是“
reference
,可转换为T
“,但没有说reference
必须是引用类型。然而,解引用一个前向迭代器 * 是 * 需要产生一个glvalue:
如果
X
是可变迭代器,则reference
是对T
的引用;如果X
是常量迭代器,则reference
是对const T
的引用,所以继续写你的迭代器来动态地生成元素,但是它只能是一个输入迭代器,而不能是一个前向迭代器。对于许多算法,这是足够的(* 例如,*
std::for_each
和std::all_of
)。vohkndzv2#
从c++20开始,这个要求似乎已经放松了:
备注:
与LegacyForwardIterator要求不同,forward_iterator概念不需要解引用来返回引用。
https://isocpp.org/files/papers/N4860.pdf#page=920