A C++0x-ben az auto kulcsszónak új értelmet adtak. Annyira, hogy a régi értelmében már nem is szabad használni. Tehát ez tilos:
auto int r;
Az új értelme az, hogy megpróbálja kitalálni milyen típust is akarunk írni. Így sok esetben helyet spórolunk meg magunknak, mivel az auto csak 4 karakter, míg a típus tipikusan hosszabb. Változó inicializálásakor az auto a típus helyett áll:
auto x = 5;
Megjegyzés: egy auto szó csak egyetlen típust helyettesíthet. Így a példában v és u esetén is intet jelöl. Ha 6.0 állna a végén, akkor hibát jelezne a fordító.
const auto *v = &x, u = 6;
auto x = {1, 2};
Szerepelhet new után is. Itt az auto automatikusan meghatározza a mögötte zárójelben lévő kifejezés típusát, és olyan objektumot hoz létre. A new egy pointert ad vissza arra az objektumra:
auto x = new auto('a');
A szabványban nem láttam semmi arra utaló megjegyzést, hogy a zárójelben lévő kifejezést végrehajtja-e, illetve hogy mivel fogja inicializálni a memóriát. De a Visual Studioban elég egyértelműen végrehajtódik a kifejezés, és a végeredményével töltődik fel a lefoglalt terület.
Ezen felül az auto használható még az újfajta függvénydeklarációra is (ami egyébként erősen hajaz a lambda-függvények alakjára):
auto add(int a, int b) -> int
{
return a + b;
}
Amint láthatjuk a paraméterlista után áll a visszatérési érték típusa. Itt a visszatérési értékre típusára mindig szükség van a lamba-függvényekkel ellentétben. És hogy ez az alak mire jó? Arról majd a perfect forwardingnál.
Megjegyzés: A VS2010 bétáját próbálgatva még elég sok dolgot hibának vél szerkesztés közben, és ezért aláhúzza őket. De lefordítani le tudja.
Lapzárta után érkezett: Azért az dolog nem fenékig tejfel. Egy jelentős problémáról megfeledkeztek: az autót nem lehet template paraméterként használni. Ez pedig baj. Mert hogy az újonnan bevezetett smart pointerek, shared_ptr és társai, a típust a template paraméterükbe kérik. Vagyis a kód csak hosszabb lessz:
shared_ptr<auto> sx(new string("Hello"));
shared_ptr<string> sx(new string("Hello"));
Még valami: Bár iterátorciklusoknál nagyon jól jön az, hogy nem kell kiírni az iterátor hosszú nevét, akad egy kis gond: a begin mindig csak nem konstans iterátort ad vissza. Így ha mi konstans iterátort szeretnénk, akkor megintcsak ki kéne írni a teljes nevet. Ezért találták ki a cbegin metódust, ami csak abban különbözik a begin-től, hogy konstans iterátort ad vissza. Természetesen a párja a cend. Van belőle fordított irányba működő is: crbegin és crend. (Halmozzuk a betüket és az élvezeteket. Remélem a jövőben nem folytatják az egy szó - egy betű rövidítést.) A ciklus végén az cend és a crend felcserélhetők end-del és rend-del. Teljes kompatibilisek, amennyire én tudom.
vector<int> vx;
for (int i = 0; i < 10; ++i) vx.push_back(i);
for (auto i = vx.cbegin(); i != vx.cend(); ++i)
cout << *i << " ";
cout << endl;
for (auto i = vx.cbegin(); i != vx.end(); ++i)
cout << *i << " ";
cout << endl;
for (auto i = vx.crbegin(); i != vx.crend(); ++i)
cout << *i << " ";
cout << endl;
for (auto i = vx.crbegin(); i != vx.rend(); ++i)
cout << *i << " ";
cout << endl;