迭代器的运算符 * return 可以按值吗?

May iterator's operator * return by-value?

所以,我想了解是否允许 const_iterator(即不可变)按值 return。

我发现 return 类型的 *r 应该是 reference(1),其中 referenceiterator_traits<X>::reference(2)。命名明显表明它通常应该是引用类型,但它必须吗?

不同的迭代器类别在这方面有什么区别吗?

我所有的标准链接(见下文)都是 n3242(我相信是最后的 c++11 草案),但我也很想知道 c++ 版本之间的区别,如果有的话。

(1) 24.2.2.2
(2) 24.2.1.11

前向和更强的迭代器应该 reference 是一个实际的引用类型 ([forward.iterators]/p1):

A class or pointer type X satisfies the requirements of a forward iterator if

  • [...]
  • if X is a mutable iterator, reference is a reference to T; if X is a const iterator, reference is a reference to const T,
  • [...]

输入迭代器可以有非引用 referenceistreambuf_iterator<charT>::reference,例如charT.

标准是 contradictory 关于 reference 可以用于输出迭代器的内容。引用链接的 LWG 问题,它 "can and can't be void".

请注意,标准本身存在:从 N4140 开始,vector<bool>::iterator 应该是随机访问迭代器,但甚至不满足前向迭代器要求,因为它的 reference 需要是包装器 class 而不是实际的引用类型。* 另一个 current proposal 包含更多谎言(参见 bounds_iterator)。


* 通过 N4284 应用的编辑,[vector.overview] 不再对 vector<bool>::iterator 提出任何要求超出 table 96 中的那些 - 这需要前向迭代器或更强的迭代器,因此标准仍然存在。

语言规范中没有明确规定运算符 * 应该 return 任何特别的东西。

显然,如果像往常一样将运算符 * 用作取消引用运算符,return 引用是一个很好的做法。

Boost xpressive 是一个广泛采用且备受推崇的模板库示例,它使用运算符 * 来 return 表示零次或多次匹配多个相似项的操作的对象。

此处的文档:

http://www.boost.org/doc/libs/1_57_0/doc/html/xpressive.html