2015-02-23 59 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