![](/img/trans.png)
[英]No match for “operator-” on reverse_iterator for std::map
[英]Gnu's reverse_iterator<Iterator>::operator-> and proxy iterators
我已經意識到,根據[reverse.iter.opref]中的C ++ - 14標准, reserver_iterator<Iterator>::operator->
必須等效於:
return std::addressof(operator*());
而在C ++ 11( 鏈接到同一部分 )是:
return &(operator*());
std::addressof
是在C ++ 11中添加的,所以,它可以在這里使用。 我認為這可能只是一個后來糾正的缺陷。
但是,GLIBCXX的反向迭代器(版本6.2.0的gcc)的實現遵循前C ++ 14定義:
// /usr/include/c++/6.2.0/bits/stl_iterator.h:174
{ return &(operator*()); }
在該句子中使用operator&
允許代理迭代器重載operator&
reference
類型,以便在需要時為迭代器提供正確的語義。 因此,也許gcc並不認為reference
將是前向迭代器案例的真正參考,因為標准要求。
gcc是否明確允許代理迭代器(它們通常可以工作)? 其他編譯器是否做同樣的事情?
std::reverse_iterator<Iterator>::operator->
中的&
的使用在2188中被標記為庫缺陷,並且在C ++ 14中引入了更改。
但是,這種變化並不令人滿意,因為std::reverse_iterator
需要一個雙向迭代器,並且它不禁止代理指針(沒有迭代器概念禁止它)。 雖然前向迭代器的reference
必須是真正的引用,但同樣不適用於pointer
類型:它不需要是pointer
值類型的pointer
,它可以是代理指針。
所以,還有另一個圖書館問題,仍然是開放的,沒有就如何解決這個問題達成共識: 1052 。 也許這個問題是因為gcc不會改變operator->
的實現 - operator->
(或許他們只是忘了它)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.