为什么C++迭代器必须返回引用?

63lcw9qa  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(130)

我正在实现一个迭代器,它迭代生成器函数的结果,而不是内存中的数据结构,如向量或Map。
通过阅读final working draft for C++17 §27.2.3,输入迭代器(以及扩展到大多数其他迭代器)a forward iterator的解引用操作符的返回类型必须是引用。对于迭代器正在迭代的数据结构中存在的项,这是很好的。然而,因为我没有使用数据结构,并且在调用解引用操作符时计算每一项,所以我没有要返回的有效引用;当操作员返回时,计算项被销毁。为了解决这个问题,我将计算结果存储在迭代器本身中,并返回对存储结果的引用。这对于我的用例来说很好用,但是当与任意用户定义的类型一起使用时,它有自己的问题。
我可以理解迭代器被允许返回一个引用,但为什么这是非可变迭代器的要求呢?标准的作者没有考虑生成器和动态转换是迭代器的有效用例吗?返回一个值而不是一个常量引用会造成任何实际的伤害吗?
[edit]:我问更多的是出于好奇,为什么标准是这样写的,因为我已经有了一个非常好的解决方案。

lfapxunr

lfapxunr1#

解引用输入迭代器是 * 不 * 需要产生一个glvalue(即返回一个引用)。输入迭代器要求解引用时的返回类型必须是“reference,可转换为T“,但没有说reference必须是引用类型。
然而,解引用一个前向迭代器 * 是 * 需要产生一个glvalue:
如果X是可变迭代器,则reference是对T的引用;如果X是常量迭代器,则reference是对const T的引用,
所以继续写你的迭代器来动态地生成元素,但是它只能是一个输入迭代器,而不能是一个前向迭代器。对于许多算法,这是足够的(* 例如,* std::for_eachstd::all_of)。

vohkndzv

vohkndzv2#

从c++20开始,这个要求似乎已经放松了:
备注:
与LegacyForwardIterator要求不同,forward_iterator概念不需要解引用来返回引用。
https://isocpp.org/files/papers/N4860.pdf#page=920

相关问题