Sık Yapılan Hatalar: auto Anahtar Sözcüğünü Yanlış Kullanma
autoC++11'den beri derleyicinin türü otomatik çıkarmasını sağlıyor. Pratik görünse de yanlış kullanılınca ciddi sorunlar çıkıyor. En sık hatalardan bahsedelim.
En tehlikeli hata: auto kullanınca referans & kayboluyor. Veri kopyalanıyor, orijinal değişken değişmiyor.
1std::vector<int> vec = {1, 2, 3};23// YANLIŞ: kopya oluşur4for (auto x: vec) {5x = 100; // vec değişmez!6}78// DOĞRU: referans tutar9for (auto& x: vec) {10x = 100; // vec değişir11}1213std::cout << vec[0]; // 100 yazılırÇıktı: 100
Eğer değişiklik yapmayacaksan const auto& kullan (performans + güvenlik).
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
const autoyazmazsanız, const nesneyi değiştirilebilir sanıyor derleyici.
1const std::string str = "sabit";23// YANLIŞ: derleyici uyarı verir4auto s = str; // kopya, const değil56// DOĞRU7const auto& s = str; // orijinal, constauto ile auto arasındaki fark kritik. Biri pointer, diğeri kopya.
1int arr[] = {1, 2, 3};2int* ptr = arr;34// YANLIŞ: kopya pointer5auto p1 = ptr; // int*67// Konteyner içinde YANLIŞ8std::vector<int*> ptrs = {&arr[0], &arr[1]};9for (auto p: ptrs) {10delete p; // hata! dinamik değil11}1213// DOĞRU: referans pointer14for (auto* p: ptrs) {15// p artık int*, güvenli16}Bazen auto beklediğiniz türü değil, başka bir türü çıkarıyor.
1std::map<std::string, int> m = {{"a", 1}};23// YANLIŞ: std::pair<const std::string, int> kopya4auto item = *m.begin();56// DOĞRU: referans tutar7auto& item = *m.begin();8item.second = 2; // harita değişir- Değiştireceksen:
auto& - Sadece okuyacaksan:
const auto&(en hızlı) - Pointer işlemiyorsan:
autoveyaauto - Şüpheleniyorsan:**
autoyerine açık tür yaz
bknz: Defer Anahtar Sözcüğü: Kaynakları Güvenli Serbest Bırakma
5 yorum
aslında auto& ile auto arasındaki fark fark ettim referans kaybı gerçekten rahatsız edici
kopya yerine referans kullanınca performans da düşüyor aslında hem veri hem de hız kaybı yaşıyorsun
evet const auto& kullanmaya başladıktan sonra hız farkını kendim de gördüm özellikle
ya özellikle büyük objelerle çalışırken fark çok belli oluyor bir kere kopyalanmamışsa
haklısın bir kere vector ya da string gibi şeyleri kopyalamaya başlayınca işlemci bayağı uğraşıyor