進一步滿足輸出迭代器要求的迭代器被稱爲可變迭代器。不可變迭代器被稱爲不變迭代器。 [24.2.1:4]增加可變輸入迭代器是否使舊迭代器值失效?
這表明你可以有一個可變的輸入迭代器,它滿足輸入和輸出迭代器的要求。
遞增輸入迭代器後,其舊值的副本不需要可解引用[24.2.3]。但是,標準對輸出迭代器來說並不一樣;實際上,後綴增量的操作語義爲{ X tmp = r; ++r; return tmp; }
,表明輸出迭代器可能不會使舊迭代器值無效(副本)。
所以,可以增加一個可變的輸入迭代器使舊的迭代器副本失效?
如果是這樣,您將如何支持代碼如X a(r++); *a = t
或X::reference p(*r++); p = t
(例如)代理對象?
如果不是,那麼爲什麼boost::iterator
聲稱它需要代理對象? (鏈接是代碼;向下滾動閱讀關於struct
的評論writable_postfix_increment_proxy
和postfix_increment_result
)。也就是說,如果您可以返回舊迭代器值的(可解除引用的)副本,那麼爲什麼您需要將此副本包裝在代理中?
@MarkRansom是的,當人們試圖理解他們正在使用的語言時,我確信討厭。他們都是這樣的......我需要在* this *註釋中告訴世界我的仇恨在這裏(對於記錄來說,迭代器類別在C++中是一個大問題,瞭解它們每個都可以做什麼是非常有用的) – jalf 2012-08-13 08:10:21
@MarkRansom:我的問題對我很重要,因爲肯定的答案意味着我必須向我的類中添加另一個代理對象來處理可變輸入迭代器,就像Boost一樣。下面的共識表明,不存在可變輸入迭代器(儘管在24.2.1:4中有評論)。這反過來表明Boost在處理「可變輸入迭代器」時是不正確的---如果即使Boost開發者誤解了這個標準的這個方面,這不是一個應該解決的問題嗎? – nknight 2012-08-13 19:58:14