为什么返回引用需要C ++迭代器?

时间:2017-10-08 01:52:53

标签: c++ iterator std standard-library c++-standard-library

我正在实现一个迭代器,它迭代生成器函数的结果,而不是内存中的数据结构,如矢量或映射。

通过final working draft for C++17§27.2.3阅读,的解引用运算符的返回类型是一个输入迭代器(通过扩展,大多数其他迭代器) a forward iterator是必需的作为参考。这适用于迭代器迭代的数据结构中存在的项。但是,因为我没有使用数据结构并且在调用取消引用运算符时计算每个项目,所以我没有返回的有效引用;当操作员返回时,计算的项目将被销毁。为了解决这个问题,我将计算结果存储在迭代器本身并返回对存储结果的引用。这适用于我的用例,但在与任意用​​户定义类型一起使用时会出现问题。

我可以理解允许返回引用的迭代器,但为什么这是非变异迭代器的要求?该标准的编写者是否认为生成器和即时转换是迭代器的有效用例?返回值而不是const引用会导致任何实际的伤害吗?

[编辑]:我更多的是出于对为什么标准按照原样编写的好奇心的要求,因为我已经有了一个非常好的解决方法。

1 个答案:

答案 0 :(得分:4)

取消引用输入迭代器需要产生glvalue(即返回引用)。输入迭代器要求说解除引用时的返回类型必须是“reference,可转换为T”,但它没有说明reference必须是引用类型。

但是,取消引用前向迭代器 需要产生glvalue:

  

如果X是可变迭代器,reference是对T的引用;如果X是常量迭代器,reference是对const T的引用,

所以继续编写你的迭代器来动态生成元素,但它只能是一个输入迭代器,而不是一个前向迭代器。对于许多算法来说这已足够(,例如 std::for_eachstd::all_of)。