所以,我想了解是否允许const_iterator(即不可变)返回by-value。
我发现*r
的返回类型应为reference
(1),其中reference
为iterator_traits<X>::reference
(2)。命名清楚地表明它通常应该是引用类型,但是它必须吗?
在这方面不同的迭代器类别之间有什么区别吗?
我所有的标准链接(见下文)都是针对n3242(我相信最后的c ++ 11草案),但是我也有兴趣知道c ++版本之间的区别,如果有的话。 / p>
(1)24.2.2.2
(2)24.2.1.11
答案 0 :(得分:3)
前向和更强的迭代器应该reference
是实际引用类型([forward.iterators] / p1):
类或指针类型
X
满足前锋的要求 迭代器,如果
- [...]
- 如果
X
是可变迭代器,则reference
是对T
的引用;如果X
是常量迭代器,则reference
是对const T
的引用,- [...]
输入迭代器可以具有非引用reference
。例如,istreambuf_iterator<charT>::reference
是charT
。
关于输出迭代器reference
的标准是contradictory。引用链接的LWG问题,它“可以而且不能是void
”。
请注意,标准本身存在:从N4140开始,vector<bool>::iterator
应该是一个随机访问迭代器,但它甚至不满足前向迭代器的要求,因为它的reference
需要是一个包装器class,而不是实际的引用类型。 * 另一个current proposal包含更多谎言(请参阅bounds_iterator
)。
* 通过N4284应用的修改,[vector.overview]不再对vector<bool>::iterator
的要求超出表96中的要求 - 这需要转发迭代器或更强,所以标准仍在撒谎。
答案 1 :(得分:0)
语言规范中没有明确的授权,即运营商*应该特别返回任何内容。
显然,如果operator *正在被用作解除引用运算符,那么返回引用是一种好习惯。
Boost xpressive是一个广泛采用且备受推崇的模板库的示例,它使用operator *返回一个对象,该对象表示匹配多个相似术语零次或多次的操作。
此处的文档:
http://www.boost.org/doc/libs/1_57_0/doc/html/xpressive.html