2. Typy danych

2.3. Słowo kluczowe auto

Proste udogodnienie składniowe – kompilator sam określa typ zmiennej – na podstawie jej inicjalizacji.  Nie ma to nic wspólnego z późnym wiązaniem nazw zmiennych – w C++ typ ciągle musi być znany na etapie definicji zmiennej. 

Słowo kluczowe auto już istniało we wcześniejszych wersjach języka, gdzie oznaczało zmienną zdefiniowaną domyślnie – bez modyfikatorów, lecz w praktyce nie było używane: 


	int a;
	auto int a;

oznacza dokładnie to samo.

Nowe znaczenie wymusza na kompilatorze analizę wyrażenia inicjującego i przypisanie typu tam określonego.  Zasady dedukcji typu dla auto są identyczne jak dla dedukcji typów w funkcjach szablonowych - o czym dowiecie się w trzeciej części podręcznika. Na razie niech Wam wystarczy fakt, że zostanie przyjęty ten typ, który został wydedukowany podczas inicjacji zmiennej, co oznacza że inicjacja zmiennych deklarowanych jako auto jest wymagana.


auto i{10}; 
auto *tablica = new double[100]; 
std::vector<double> dane; 
for (auto i=dane.begin(); i!=dane.end(); i++) {
  *i = rand(); 
  …
}

C++14 pozwala stosować auto także do typu zwracanego z funkcji.

Wydaje mi się, że stosowanie auto jest dobrym pomysłem - bo właśnie wymusza na nas konieczność inicjacji typów, no i zabezpiecza nas przed błędami:


int a; // inicjowane bądź nie – w zależności od kontekstu
auto a{0}; // bez inicjacji błąd kompilacji

std::vector<int> v; 
unsigned s = v.size(); // 32 bit win – ok, w 64 bit – v.size() jest 64-ro bitowe
auto s = v.size();     // zawsze ok

map<string, int> m;
for (pair<string, int>& p : m) { // błąd kompilacji – brak możliwości rzutowania
   p.second = 13;
}
for (const pair<string, int>& p : m) { 
   p.second = 13; // błąd kompilacji – p jest stałe
}
for (auto& p : m) { // ok, typ p to pair<const string, int> 
   p.second = 13; 
}