2015-02-23 63 views
1

所以,我想了解是否允许const_iterator(即不可变)按值返回。可能迭代器的运算符*按值返回?

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

有没有在这方面不同的iterator范畴之间有什么区别?我所有的指向标准的链接(见下面)都是针对n3242(我相信最后的C++ 11草案),但是我也很想知道C++版本之间的区别(如果有的话)。

(1)24.2.2.2
(2)24.2.1.11

+0

一个'const_iterator'应该返回一个'常量&'这样你就没有昂贵的复制操作。 – NathanOliver 2015-02-23 17:50:29

+3

'vector '指向包装器的迭代器。所以是的。 – Jarod42 2015-02-23 17:50:45

+0

@NathanOliver,重点不在于复制,而在于返回位于迭代器中的值。 – RiaD 2015-02-23 17:51:44

回答

3

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

一个类或指针类型X满足要求的向前 迭代如果

  • [...]
  • 如果X是一个可变迭代器,referenceT的引用;如果X是一个常量迭代,referenceconst T基准,
  • [...]

输入迭代可具有非基准reference秒。例如,istreambuf_iterator<charT>::referencecharT

标准是contradictory关于什么reference可以用于输出迭代器。引用链接的LWG问题,它“可以也不可以是void”。

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


*N4284应用的编辑,[vector.overview]不再放在vector<bool>::iterator超出表96中发现的任何要求 - 需要前向迭代或更强,所以该标准还躺在。

0

在语言规范中没有明确的规定,operator *应该特别返回任何东西。

显然,如果运算符*通常用作解引用运算符,则返回引用是一种很好的做法。

Boost xpressive是一个广泛采用并广受好评的模板库的示例,它使用运算符*返回一个对象,该对象表示将匹配多个相似项的操作零次或多次。

文档浏览:

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