可以迭代器的运算符*返回值吗?

时间:2015-02-23 17:40:36

标签: c++ language-lawyer

所以,我想了解是否允许const_iterator(即不可变)返回by-value。

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

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

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

(1)24.2.2.2
(2)24.2.1.11

2 个答案:

答案 0 :(得分:3)

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

  

类或指针类型X满足前锋的要求   迭代器,如果

     
      
  • [...]
  •   
  • 如果X是可变迭代器,则reference是对T的引用;如果X是常量迭代器,则reference是对const T的引用,
  •   
  • [...]
  •   

输入迭代器可以具有非引用reference。例如,istreambuf_iterator<charT>::referencecharT

关于输出迭代器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