我正在实现一个迭代器,它迭代生成器函数的结果,而不是迭代内存中的数据结构,例如向量或映射。
通读 C++17 最终工作草案 §27.2.3,需要 输入迭代器(以及通过扩展,大多数其他迭代器) 前向迭代器 的解引用运算符的返回类型做个参考。这对于迭代器正在迭代的数据结构中存在的项目来说很好。但是,因为我没有使用数据结构,并且在调用取消引用运算符时计算每个项目,所以我没有要返回的有效引用;当运算符返回时,计算项将被销毁。为了解决这个问题,我将计算结果存储在迭代器本身中,并返回对存储结果的引用。这对于我的用例来说效果很好,但在与任意用户定义类型一起使用时有其自身的问题。
我可以理解迭代器“允许”返回引用,但为什么这是非变异迭代器的要求呢?标准的编写者是否不认为生成器和动态转换是迭代器的有效用例?返回一个值而不是 const 引用会造成任何实际伤害吗? [编辑]:出于好奇,我询问更多关于
为什么标准是这样编写的,因为我已经有了一个非常好的解决方法。
reference
,可转换为T
”,但没有任何地方说
reference
必须是引用类型。但是,需要取消引用前向迭代器才能产生泛左值:
如果 X
reference
是对
的引用;如果T
是常量迭代器,则X
是对reference
,const T
的引用因此,继续编写可以动态生成元素的迭代器,但它只能是输入迭代器,而不能是前向迭代器。对于许多算法来说,这已经足够了(例如,
std::for_each
和std::all_of
)。
从 c++20 开始,该要求似乎已放宽: