繁体   English   中英

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

[英]Why are C++ iterators required to return a reference?

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

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

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

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

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

然而,解引用前向迭代就是产生glvalue要求:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM