【发布时间】:2018-03-19 12:07:31
【问题描述】:
我正在实现一个迭代器,它对生成器函数的结果进行迭代,而不是对内存中的数据结构(例如向量或映射)进行迭代。
通读final working draft for C++17 §27.2.3,输入迭代器(以及大多数其他迭代器)的解引用运算符的返回类型 a forward iterator 必须是引用.这对于迭代器正在迭代的数据结构中存在的项目很好。但是,因为我没有使用数据结构并且在调用取消引用运算符时正在计算每个项目,所以我没有有效的返回引用;当操作员返回时,计算的项目被销毁。为了解决这个问题,我将计算结果存储在迭代器本身并返回对存储结果的引用。这适用于我的用例,但在与任意用户定义类型一起使用时会出现问题。
我可以理解 允许 迭代器返回引用,但为什么这是非变异迭代器的要求?标准的作者是否没有将生成器和动态转换视为迭代器的有效用例?返回值而不是 const 引用会造成任何实际伤害吗?
[edit]:出于对为什么标准的编写方式的好奇,我提出了更多的问题,因为我已经有了一个非常好的解决方法。
【问题讨论】:
-
我认为锻炼答案(来自专家)的一个很好的例子是
std::istream_string。话虽如此,我的直觉是返回一个值T并不比返回一个const T&好,因为在某些情况下,取消引用可能希望返回一个实际的临时值,而在其他时候它想返回一个实际预先存在的元素。 -
@alfc 没有 istream_string 这样的东西。你的意思是字符串流吗?因为它不使用迭代器,如果它使用了它返回的字符仍然会来自某个地方的缓冲区。
-
啊,我明白了,它是 istream_iterator。
-
是的,我是这个意思。
-
这很奇怪,因为纯右值上的本地
const T&会延长纯右值的生命周期,直到引用范围结束。似乎大多数假设 Forward(或更高版本)输出迭代器返回const T&的算法都适用于纯右值。但我理解措辞似乎不同意这一点
标签: c++ iterator std standard-library c++-standard-library