C++'de auto anahtar kelimesi (C++11'den itibaren), derleyicinin değişken tipini başlatıcı ifadeden otomatik olarak çıkarmasına olanak tanır. Bu, uzun tiplerle (örneğin, iteratörlerle, lambda ifadeleriyle, şablon ifadeleriyle çalışırken) çalışmayı kolaylaştırır ve kodun okunabilirliğini artırır.
Kullanım örneği:
auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // iteratör
Ancak, auto tam olarak kendisine "sunulan" şeye göre tip çıkarır. Örneğin, eğer değer olarak dönerse, auto değer çıkarır; eğer referans olarak dönerse, referans çıkarır. Referanslarla, işaretçilerle, const nitelikleriyle çalışırken dikkatli olunmalıdır.
Önemli örnek:
std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // kopyalama, v değişmeyecek for (auto& x : v) x = 0; // referans, elemanlar sıfırlanacak
const auto z = foo();ifadesindeki değişken 'z' 'foo()' metodunun int referansı (int&) döndürmesi durumunda ne tür bir tipe sahip olacaktır?
Cevap:
const auto z tipi int (değer) olarak çıkar, eğer referans döndürüyorsa. Referansı çıkarmak için auto& z kullanmak gerekir. const nitelikleri, tür çıkarımından sonra auto-tipe uygulanır.
Örnek:
int x = 5; auto a = x; // a — int auto& b = x; // b — int& const auto c = x; // c — const int auto d = foo(); // d — int (eğer foo int döndürüyorsa) auto& e = foo(); // e — int&
Hikaye
Büyük bir web hizmetinde, akıllı işaretçi koleksiyonu üzerinde auto yerine range-based for c auto kullanıldı. Bu, nesnelerin kopyalanmasına neden oldu ve milyonlarca kayıt ile işlem yaparken programı 16 kat yavaşlattı.
Hikaye
Grafikle çalışma kütüphanesinde, döndürülen iteratöre auto uygulandı, bunun bir referans olmasını bekleyerek, ancak geçici bir nesne elde edildi. İteratör, döngüden önce yok oldu, program UB'ye düştü.
Hikaye
Finansal sistemde, map'ten değer elde etmek için auto kullanımı sırasında anahtarın constness'ını unuttular, bu da verileri değiştirirken bir yapılamayan referans yoluyla veri değişikliği yapmaya çalışmayı ve sonrasında derleme hataları ve çalışma zamanı çökmelerine neden oldu.