2012-04-17 23 views
5
for (Something something : setOfSomething)   // OK 
for (Something const& something : setOfSomething) // OK 
for (Something& something : setOfSomething)   // ERROR 

error: invalid initialization of reference of type 'Something&' 
from expression of type 'const Something' 

'için' aralık tabanlı yana yineleyici dönüş const Something yaptığında? Something& veya Something const& döndürmelidir. Ve aralık tabanlı 'for' döngüsü that gibi yorumlandığından, neler olup bittiğine dair makul bir açıklama yapıyorum.bir STL kabın elemanına referans Kazanılması C++ 11 döngü

Düzenleme: Ben set yerine yaklaşık unordered_set bahsediyorum, bu karışıklık için özür.

cevap

13

set üyelerini değiştiremezsiniz, çünkü bu, set değişmezlerini ihlal edebilir. Bu yüzden derleyici, const referanslarını veya kopyalarını geri almanızı kısıtlar.

+0

Nesnemi değiştirirseniz ne tür bir değişmezler bozulabilir. Kapladığı bellek yeri ve büyüklüğü el değmeden kalır - ve bu iki şey kontrol edeceği tek şeydir. Ek olarak, kendi konteynerine sahip olsam ne olur? Derleyici neden bu tür bir kısıtlamayı konteynerlerime empoze eder? Dürüst olmak gerekirse, kirli bir hack gibi görünüyor. –

+1

Nesnelerin bölümlerini "set" in karşılaştırmasıyla karşılaştırdığınızda, "set" içindeki nesnelerin sıralanması değiştirilebilir. Bu sorun, std :: set 'veya akrabalarından (çoklu, sırasız, vb.) Başka bir kapsayıcıda gerçekleşiyorsa, sorunuzu daha ayrıntılı olarak düzenleyebilir misiniz? –

+0

Benim sorunum o zaman - Ben bir aptalım, ama onun derleyicinin işi değil. Dahası, onu eski tarz bir yineleyici döngüsünde değiştirebilirim. –