Kendimi daha son zamanlarda C++ 11 daha kullanarak bulmak ve geçmişte iterators kullanıyoruz nerede, şimdi range-based for loops kullanıyorum Mümkün:Temel türler üzerinde yineleme yaparken const başvuru kullanmanın herhangi bir dezavantajı var mı?
std::vector<int> coll(10);
std::generate(coll.begin(), coll.end(), []() { return rand(); });
C++ 03:
C++ 11
for (std::vector<int>::const_iterator it = coll.begin(); it != coll.end(); ++it) {
foo_func(*it);
}
:
for (auto e : coll) { foo_func(e); }
Ama ne toplama elemanı tipi bir şablon parametresi ise? Ben C++ 03 kullanıyordum ederken
foo_func(const BigType& e) { ... };
foo_func(int e) { ... };
Bu kadar düşünce vermedi: foo_func()
muhtemelen değerine göre const referans olarak kompleks (= kopyalamak için pahalı) türlerini ve basit olanları geçmek aşırı yüklenecektir yukarıdaki tarz kodu. Aynı şekilde yinelemeliyim, ve dereferencing bir const_iterator bir const referansı ürettiğinden, her şey yolundaydı. Ama C++ 11 aralık tabanlı döngü için ben aynı davranışı elde etmek için bir const referans döngü değişkeni kullanmak zorunda kullanarak: Bu tanıtmak olmaz ise, artık
for (const auto& e : coll) { foo_func(e); }
Ve birden emin değildi Gereksiz montaj talimatları auto
basit bir türse (referansı uygulamak için sahne arkası işaretçisi gibi).
Ancak, örnek bir uygulama derlemek, basit türler için ek yük olmadığını doğruladı ve bu, şablonlardaki döngüler için aralık temelini kullanmanın genel yolu gibi görünüyor. Bu durum böyle olmasaydı, boost::call_traits::param_type gitmek için yol olurdu.
Soru: Standartta herhangi bir garanti var mı?
(Konunun pek döngüler için tabanlı aralığı ile ilişkili olmadığını biliyoruz. Const_iterators kullanırken Ayrıca hediyesi.)
Ya da sadece 'auto const &'. ;'u kullanarak – Xeo
@Xeo: Yineleyici, bir değere [' const'] referansı yerine bir değer verirse, "T & amp;" değeri, bir referanstan ziyade değeri çıkarır. değer. –
* Huh? * 'Auto &&, her zaman bir referans olur, yineleyiciler ne olursa olsun. Gerçekten bir değer verirse, bu sadece bir referans olacaktır. (Not: Yorumunuzu yanlış anlamış olabilirim.) – Xeo