2013-01-18 75 views
23

我正在閱讀關於VC11的C++ 11功能的VC11 Blog,當時我談到了SCARY迭代器主題。什麼是SCARY迭代器?

什麼很可怕的迭代器和如何影響我的C++編程經驗?

+3

它們以描述n2980(http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2009/n2980.pdf)和[n2911](HTTP:// WWW。 open-std.org/jtc1/sc22/WG21/docs/papers/2009/n2911.pdf)。你讀過那些報紙嗎? – Mankarse

+5

http://blogs.msdn.com/b/vcblog/archive/2012/04/06/10291485.aspx – Macmade

+1

我總是希望'的std ::矢量 :: iterator'將是一個普通的老'T *' 。沒有什麼比這更恐怖的了。 – ybungalobill

回答

12

如果你是使用他們,沒有必要得到SCAREd ......只是忽略他們的SCARY-ness。

如果你是製作他們,這意味着你必須使你的迭代器獨立於容器的分配器類型和容器的其他通用參數不影響迭代器。

+1

出於好奇,對於具有非默認分配器的任何給定對象,或者存在對象具有非默認分配器的可能性,使用'decltype'而不是依賴於編譯器是否更好實現SCARY迭代器?例如,如果您由於某種原因,創建一個'的std ::矢量<整型,性病::分配器> vTerribleIdea','decltype(vTerribleIdea):: iterator'將擴大到正確的迭代器,不管是否迭代器綁到分配器或不。 [見http://ideone.com/MLHhCa,或通過MSVC運行它以獲得更可讀的內容。 ] –

+1

我可以看到SCARY迭代器如何對預先存在的代碼有用,並允許編譯器正確處理代碼,而不必重寫它以解釋非默認迭代器,但是在編寫新的,類型無關的時候它們是不必要的代碼因爲'decltype',還是有利用SCARY行爲而不是使用'decltype'顯式指定我不知道的迭代器類型? [不包括不符合C++ 11標準的編譯器,它們通常不支持SCARY迭代器或'decltype'。] –

2

從鏈接的PDF,在http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2009/n2911.pdf

縮寫SCARY介紹了看似錯誤(由衝突的泛型參數出現的約束),但正確的實現(不受約束的衝突其實工作任務和初始化由於最小化依賴)。

+24

爲+0.5參考(儘管鏈接不是答案)。 +0.5用於引用倒序(儘管在沒有進一步的上下文的情況下它不是很明顯)。 -1不回答問題。 –