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

Chr*_*ren 9 c++ iterator std standard-library c++-standard-library

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

通过阅读C++ 17§27.2.3 的最终工作草案,输入迭代器(以及扩展名,大多数其他迭代器) 的解引用运算符的返回类型需要一个前向迭代器作为引用.这适用于迭代器迭代的数据结构中存在的项.但是,因为我没有使用数据结构并且在调用取消引用运算符时计算每个项目,所以我没有返回的有效引用; 当操作员返回时,计算的项目将被销毁.为了解决这个问题,我将计算结果存储在迭代器本身并返回对存储结果的引用.这适用于我的用例,但在与任意用​​户定义类型一起使用时会有自己的问题.

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

[编辑]:我问的更多的是出于好奇关于为什么标准被写入事情是这样的,因为我已经有一个非常好的解决方法.

Bri*_*ian 6

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

然而,解引用前向迭代器产生一个glvalue要求:

如果X是可变迭代器,reference则是对T; 的引用。如果X为常数迭代器,reference则为的引用const T

因此,继续编写动态生成元素的迭代器,但它只能是输入迭代器,不能是正向迭代器。对于许多算法,这已经足够了(例如 std::for_eachstd::all_of)。

  • 好的,因此不需要X :: reference成为输入迭代器的实际引用类型(给定名称,这有点奇怪和出乎意料)。这仍然不能回答为什么,按照标准,为什么要求更专业的迭代器返回作为实际引用的“引用”。 (3认同)
  • 很高兴知道,当标准说“参考”时,它们并不意味着“参考”。如果是这样,很多事情对我来说就开始变得更有意义了。 (2认同)