autosessiz örtük dönüşümlerden kaçınarak performansa yardımcı olabilir . Zorlayıcı bulduğum bir örnek şudur.
std::map<Key, Val> m;
// ...
for (std::pair<Key, Val> const& item : m) {
// do stuff
}
Hatayı gördün mü? Burada, haritadaki her öğeyi const referansı ile zarif bir şekilde aldığımızı ve niyetimizi netleştirmek için yeni aralık ifadesini kullandığımızı düşünüyoruz, ancak aslında her öğeyi kopyalıyoruz . Çünkü std::map<Key, Val>::value_typeöyle std::pair<const Key, Val>değil std::pair<Key, Val>. Böylece, (örtük olarak) sahip olduğumuz zaman:
std::pair<Key, Val> const& item = *iter;
Varolan bir nesneye başvuru yapmak ve bunu ona bırakmak yerine bir tür dönüştürme yapmak zorundayız. Kullanılabilir bir örtük dönüştürme olduğu sürece farklı türde bir nesneye (veya geçici) bir const referansı almanıza izin verilir, örneğin:
int const& i = 2.0; // perfectly OK
Tip dönüşüm bir dönüştürebilirsiniz aynı nedenle izin verilen bir örtülü dönüşüm const Keybir etmek Key, ama biz bunun için izin vermek için yeni tip bir geçici inşa etmek gerekir. Böylece, döngümüz etkili bir şekilde yapar:
std::pair<Key, Val> __tmp = *iter; // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it
(Tabii ki, aslında bir __tmpnesne yok, sadece örnekleme için var, gerçekte isimsiz geçici itemyaşamı boyunca bağlı ).
Sadece şuna değiştiriliyor:
for (auto const& item : m) {
// do stuff
}
bize bir ton kopya kaydetti - şimdi referans verilen tür başlatıcı türüyle eşleşiyor, bu yüzden geçici veya dönüşüm gerekli değil, sadece doğrudan bir referans yapabiliriz.