2015-05-23 75 views
0

我想弄清楚到底是什麼要求就forward_iterators' reference類型做出。在顯而易見的情況下,您將擁有value_type = T;reference = T&;。對前向迭代器要求讀cppreference page,只見要求::參考

Expression Return  Equivalent expression 
*i++  reference value_type& temp=*i; ++i; return temp; 

std::vector<bool>表明,「等價表達式」並不總是有效的,因爲它返回一個代理對象:

std::vector<bool> v(10); 
auto i = v.begin(); 
std::vector<bool>::iterator::value_type& temp = *i; // error 
// can't bind bool& to std::_Bit_reference 

等效表達不在我看到的標準中提到。代理對象允許分配,這可能是符合性的關鍵。

除了試圖確定要求之外,我的具體問題涉及知道是否具有引用或支持賦值的地方,可以使用標準庫。

是否Container<int>iterator標記爲forward_iterator_tagreference == int有效嗎?

+1

C++ 11表109中§24.2.5/ 4給出了下面的操作語義的r ++':'{X TMP = R; ++ R;返回tmp; }',並聲明返回類型應該可以轉換爲'const X&'。 –

回答

3

要求列舉在[forward.iterators]:

一個類或指針類型X滿足如果

  • X滿足輸入迭代器的要求(所述正向迭代器的要求24.2.3),
  • X滿足DefaultConstructible要求(17.6.3.1),
  • if X是一個可變的迭代器,reference是對T的引用;如果X是一個常量迭代,參考是參考 到const T
  • [...]

所以,如果你的容器有reference == int,那麼它不符合前進的要求迭代器。我認爲在技術上,vector<bool>::iterator只是一個輸入迭代器,儘管它被標記爲隨機訪問迭代器。

+1

我想我會接受'std :: vector '是個騙子。 –