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

问题描述 投票:0回答:2

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

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

我可以理解迭代器“允许”返回引用,但为什么这是非变异迭代器的要求呢?标准的编写者是否不认为生成器和动态转换是迭代器的有效用例?返回一个值而不是 const 引用会造成任何实际伤害吗? [编辑]:出于好奇,我询问更多关于

为什么

标准是这样编写的,因为我已经有了一个非常好的解决方法。

c++ iterator std standard-library c++-standard-library
2个回答
16
投票
reference

,可转换为T”,但没有任何地方说

reference
必须是引用类型。

但是,需要取消引用前向迭代器
才能产生泛左值:

如果 X

是可变迭代器,则
reference

是对

T
的引用;如果
X
是常量迭代器,则
reference
是对
const T
,
 的引用
因此,继续编写可以动态生成元素的迭代器,但它只能是输入迭代器,而不能是前向迭代器。对于许多算法来说,这已经足够了(
例如,

std::for_each

std::all_of)。

    
从 c++20 开始,该要求似乎已放宽:


0
投票
备注:

与 LegacyForwardIterator 要求不同,forward_iterator 概念不需要取消引用来返回引用。

https://en.cppreference.com/w/cpp/iterator/forward_iterator

© www.soinside.com 2019 - 2024. All rights reserved.