A C99-ben bevezetett long long int típust most már a C++ is fogja támogatni. A szabvány szerint legalább 64 biten ábrázolódik, és legalább akkora, mint a long int.
A C++ újradefiniálja felsorolási típust is. Az eddigi felsorolási típus ugyanis nem volt típusbiztos. Ez a C++03-ban kezdett megváltozni: azóta az enum típusok nem implicit konvertálódnak egymás között, illetve egészről. Nem definiálja a szabvány azt az egész típust sem, amelyen a felsorolási típusok ábrázolódtak, a méretük a fordítótól függ. Nem lehetett továbbá egy névtérben két olyan felsorolási típus, amelyek azonos nevű értéket tartalmaznak, ugyanis az értékek nevei a típust tartalmazó névtérbe kerülnek.
Az új szabvány szerint a tároláshoz használt egész típus megadható (alapértelmezett az int) és saját névterük van:
A kompatibilitás megtartása miatt az enum kulcsszó továbbra is használható, valamint a definiált nevek a tartalmazó névtérbe is bekerülnek, de saját névtér is tartozik hozzá. Itt is megadható a tárolási típus.
Mivel az enum tárolási mérete a benne lévő adatoktól függ, nem volt forward deklarálható. Mivel most már megadható (illetve az enum class esetében ismert), lehetővé válik a forward deklarációjuk:
A szabványos C++ az explicit kulcsszót használja annak jelölésére, hogy egy konstruktor nem használható implicit konverzióra. Az új szabvány megengedi, hogy a kulcsszót konverziós operátorokon is használjuk.
A régi C++ implicit és explicit konstruktorok használatára nyújt lehetőséget.
Azonban nem a konstruktor az egyetlen lehetőség a konverzióra. Ha nincs lehetőségünk megváltoztatni egy osztályt, akkor definiálhatunk egy konverziós operátort egy másik osztályból. Például:
Sajnálatos módon nincs explicit konverziós operátor. Ezt a hiányosságot a C++11 kijavítja, és megengedi, hogy a konverziós operátorok explicitek legyenek. Például:
Az új C++ bevezeti a konstans kifejezés típusokat is a constexpr
kulcsszóval.
Ezzel a kulcsszóval jelölhetjük, ha egy függvényünk fordítási időben
kiszámítható. Ez használható többek között tömbök definiálásakor (a tömb
méretének fordítási időben ismertnek kell lennie C++-ban):
1972-ben a C-ben a 0 konstansnak két jelentése volt, egyrészt jelentette a 0 számot, másrészt a null pointert. A 0 kettős jelentését úgy kezelték, hogy bevezették a NULL szimbólumot, amelyet az előfeldolgozó oldott fel, általában a ((void *)0) kifejezésre. Ez azonban C++ tervezésekor problémákat okozott, hiszen a void * mutatók nem implicit konvertálódnak más mutató típusokra, így a C++-ban ismét a 0 szimbólumot kellett használni null pointerként (tehát a NULL is erre helyettesítődött). Azonban nem oldódott meg minden probléma.
Ekkor a foo(NULL) kifejezés a foo(int) függvényt hívja, ami megtévesztő, és egyértelműen nem a programozó szándékát fejezi ki.
Az új C++ szabvány bevezeti a nullptr
kulcsszót a null pointer jelölésére.
A nullptr típusa olyan, hogy tetszőleges mutató típusra implicit
konvertálódik, valamint tetszőleges mutatóval összehasonlítható, nem
konvertálódik azonban egész típusokra, kivéve a bool-ra.
A C++-ban részeredmények tárolása sokszor nehézkes, hiszen bonyolult típusok fordulhatnak elő benne, főleg a szabványos könyvtárt nagyrészt alkotó template-k esetén. A pontos típus a felhasználó számára sokszor nehezen határozható meg.
Az auto
kulcsszót használva a típust a fordító kikövetkezteti az inicializációs kifejezés alapján. (Tehát a változó definiálásakor kötelező azt expliciten inicializálni!)
A következő két sor ugyanazt csinálja:
Hasonló módon használhatjuk decltype
kulcsszót. Ez esetben fordítási időben kiértékelődik a zárójelben lévő kifejezés típusa,
és az így kapott típus lesz a változó típusa:
Pár további példa:
Ezzel megoldhatóvá válik egy régi dilemma a függvények visszatérési értékével kapcsolatban:
Az új függvénydeklarációs szintaxissal ez még szebb és szélesebb körűen használhatóvá válik.
A C++ korai változatában egy olyan adattag, amely konstruktorral, destruktorral, vagy értékadással rendelkezett, nem lehetett unió tagja.
Ezek után
Az új C++11 szabvány megváltoztatja a korlátozásokat.
Például:
Hibásnak tűnhet, de az új korlátozások segítenek.
Vagyis U2 használhatatlan, hacsak be nincs ágyazva egy struct-ba, ami képes figyelni, melyik adattag van használva. Vagyis: