为什么 C++ 迭代器需要 return 引用?
Why are C++ iterators required to return a reference?
我正在实现一个迭代器,它迭代生成器函数的结果,而不是迭代内存中的数据结构,例如向量或映射。
通读 final working draft for C++17 §27.2.3, the return type of the dereference operator for an input iterator (and by extension, most other iterators) 需要作为参考。这对于存在于迭代器正在迭代的数据结构中的项来说很好。但是,因为我没有使用数据结构,而是在调用取消引用运算符时计算每个项目,所以我没有对 return 的有效引用;当运算符 returns 时,计算项被销毁。为了解决这个问题,我将计算结果存储在迭代器本身中,并 returning 对存储结果的引用。这适用于我的用例,但在与任意用户定义的类型一起使用时有其自身的问题。
我可以理解迭代器被允许 到return 一个引用,但为什么这是对非变异迭代器的要求?标准的编写者是否没有将生成器和即时转换视为迭代器的有效用例? return使用一个值而不是一个 const 引用会造成任何实际伤害吗?
[edit]:出于对 为什么 标准如此编写的好奇,我想问更多,因为我已经有了一个非常好的解决方法。
取消引用输入迭代器 不是 产生左值(即 return 引用)所必需的。输入迭代器要求说取消引用时 return 类型必须是“reference
,可转换为 T
”,但没有任何地方说 reference
必须是引用类型。
但是,取消引用前向迭代器 是 产生左值所必需的:
if X
is a mutable iterator, reference
is a reference to T
; if X
is a constant iterator, reference
is a reference to const T
,
因此,继续编写动态生成元素的迭代器,但它只能是输入迭代器,而不是前向迭代器。对于许多算法来说,这就足够了(例如, std::for_each
和 std::all_of
)。
我正在实现一个迭代器,它迭代生成器函数的结果,而不是迭代内存中的数据结构,例如向量或映射。
通读 final working draft for C++17 §27.2.3, the return type of the dereference operator for an input iterator (and by extension, most other iterators)
我可以理解迭代器被允许 到return 一个引用,但为什么这是对非变异迭代器的要求?标准的编写者是否没有将生成器和即时转换视为迭代器的有效用例? return使用一个值而不是一个 const 引用会造成任何实际伤害吗?
[edit]:出于对 为什么 标准如此编写的好奇,我想问更多,因为我已经有了一个非常好的解决方法。
取消引用输入迭代器 不是 产生左值(即 return 引用)所必需的。输入迭代器要求说取消引用时 return 类型必须是“reference
,可转换为 T
”,但没有任何地方说 reference
必须是引用类型。
但是,取消引用前向迭代器 是 产生左值所必需的:
if
X
is a mutable iterator,reference
is a reference toT
; ifX
is a constant iterator,reference
is a reference toconst T
,
因此,继续编写动态生成元素的迭代器,但它只能是输入迭代器,而不是前向迭代器。对于许多算法来说,这就足够了(例如, std::for_each
和 std::all_of
)。