C++11

C++11, (ent. C++0x), on ISO:n 12.8.2011 hyväksymä C++-ohjelmointikielen standardi ISO/IEC 14882:2011. Standardi korvasi aiemmat ISO/IEC 14882:1998 (C++98) ja ISO/IEC 14882:2003 (C++03) standardiversiot.
Nimessä esiintyvä 11 tulee yleisen nimeämiskäytännön mukaisesti standardin julkaisuvuodesta. C++0x-tunnusta käytettiin työskentelyvaiheessa, koska valmistumisvuodesta ei ollut varmuutta, mutta sen uskottiin valmistuvan ennen vuotta 2010.
Standardin on korvannut C++14 standardi ISO/IEC 14882:2014, joka hyväksyttiin 18. elokuuta 2014.
C++11 lisäsi itse kieleen useita ominaisuuksia sekä laajentaa C++:n standardikirjastoa STL:a. Standardikirjaston laajennos käsittää suurimman osan aikaisemmasta C++ Technical Report 1:stä (TR1).

Tyyppiturvallinen nolla-osoitin

Kieleen on lisätty tyyppiturvallinen nullptr määrittely.
Vanha NULL -makro usein käsitellään int-tyyppinä eikä osoittimena. Vanhempi tapa voi hämmentää ajonaikaista tyyppimekanismia kutsumaan väärää metodia.
Käyttöesimerkki:
int a = 0;int *p = nullptr;p = &a;(*p) = 42;

Vakiolauseke

Vakiolauseke (constexpr) määrittää, että lauseke on mahdollista arvioida käännösaikana.
Esimerkki:
const double pi = 3.14;constexpr double pi_mul(int n) { return n * pi; }
Käyttö olettaa että parametrina annettavat arvot ovat käännösaikana tunnettuja literaaleja. C++14 laajentaa vakiolausekkeen määrittelyä.

Yhdenmukaistettu alustaminen

Olioiden alustamista on yhdenmukaistettu muutoksilla määrittelyyn.
Esimerkiksi kolmen alkion vektorin alustaminen arvoilla:
std::vector<float> v = {0.1, 0.2, 1.0};
Anonyyminen vektorin alustaminen ja välittäminen funktiolle:
myfunction( std::vector<float>{0.1, 0.2, 1.0} );

Rajatun alueen toistorakenne

Perinteisten C-kielen toistorakenteiden vaihtoehdoksi on lisätty automatisoitu vaihtoehto. Uudempi menetelmä vähentää tyypillisen koodin toistuvaa kirjoittamista.
Tietorakenteissa olevien arvojen käsittelyä voidaan yksinkertaistaa seuraavasti:
std::vector<int> v = {0, 1, 2, 3, 4, 5};for (auto i : v){
     std::cout << i << std::endl;}

Delegoiva konstruktori

Delegoiva konstruktori vähentää ohjelmakoodin toistoa useiden konstruktorien yhteydessä.
class Testi{private:
    std::string m_s;
    int m_i;public:
    Testi(std::string s, int i) : m_s(s), m_i(i) {}
    Testi(int i) : Testi("testi", i) {}};

Atomiset operaatiot

Standardi lisää standardikirjastoon atomisuuden toiminnot.
Esimerkki käyttötapauksesta:
std::atomic<long> almuuttuja;almuuttuja = 0; // asettaa arvoon 0// lisää muuttujaan arvon 42 ja palauttaa uuden arvonlong uusiarvo = almuuttuja.fetch_add(42);
Ohjelmointikielen käyttämä tekninen toteutustapa voi riippua käytetystä suorittimesta.

Säikeistyksen tuki

Monisäikeistykselle on lisätty alustariippumatonta tukea määrittelyyn. Näin ollen ohjelmakoodin siirtäminen helpottuu vähemmillä muutoksilla.
Standardikirjastossa on std::thread säikeiden luomiseen ja käsittelyyn. Parametrina tälle annetaan funktio-objekti (osoite säikeen suorituksen alkupaikkaan).
Lisäksi thread_local avainsanalla voi määritellä säiekohtaisia muuttujia.
Synkronointitukea on atomisien operaatioiden lisäksi käytettävissä luokilla std::mutex ja std::lock_guard.
Synkronointiin on myös aikarajoitettu std::timed_mutex sekä rekursion salliva std::recursive_mutex ja näiden yhdistelmä std::recursive_timed_mutex.

Tuple-tyyppi

Tuple on template-pohjainen vaihtoehto C-kielen struct-tyypille.
typedef std::tuple <int, string, double> tTuple;tTuple data(42, "heippa", 3.14);
Vastaava tietotyyppi on aiemmin esiintynyt esimerkiksi rinnakkaisohjelmointiiin kehitetyssä Alef -kielessä.

Siirto-operaattorit

Tyypillisen copy-delete menettelyn sijaan on mahdollista käyttää tehokkaampaa siirto-operaattoria (engl. move):
class MyContainer{// ...MyContainer & operator=(MyContainer && other){
    if (this != &other) 
    {
         // ...
    }
    return *this;}
Menetelmä välttää nk. deep-copy toiminnon, joka voi olla raskas käytössä.