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).
C++11:n on sanottu olevan käännekohta, jonka jälkeen käytössä on ollut ”uusi” moderni C++.
Muutokset edellisestä standardista.
Uusi standardi laajentaa varsinaista kieltä sekä sen standardikirjastoa.
Pääsuuntaviivat uutta versiota suunniteltaessa olivat: 
Aloittelijoiden huomioon ottaminen koettiin tärkeäksi, koska ohjelmoijista suurin osa tulee aina olemaan aloittelijoita, ja koska suurin osa heistä tuskin koskaan tulee perehtymään C++:aan syvällisemmin.
Tyyppiturvallinen nolla-osoitin.
Kieleen on lisätty tyyppiturvallinen codice_1 määrittely.
Vanha codice_2 -makro usein käsitellään codice_3-tyyppinä eikä osoittimena. Vanhempi tapa voi hämmentää ajonaikaista tyyppimekanismia kutsumaan väärää metodia.
Käyttöesimerkki:
int a = 0;
int *p = nullptr;
p = &amp;a;
(*p) = 42;
Vakiolauseke.
Vakiolauseke (codice_4) 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&lt;float&gt; v = {0.1, 0.2, 1.0};
Anonyyminen vektorin alustaminen ja välittäminen funktiolle:
myfunction( std::vector&lt;float&gt;{0.1, 0.2, 1.0} );
Lambda-lausekkeet.
Lambda-lausekkeet ovat paikallisia nimettömiä funktioita, joita voidaan määrittää funktion tai lausekkeen sisällä.
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&lt;int&gt; 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:
Atomiset operaatiot.
Standardi lisää standardikirjastoon atomisuuden toiminnot.
Esimerkki käyttötapauksesta:
std::atomic&lt;long&gt; almuuttuja;
almuuttuja = 0; // asettaa arvoon 0
// lisää muuttujaan arvon 42 ja palauttaa uuden arvon
long 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 codice_5 säikeiden luomiseen ja käsittelyyn. Parametrina tälle annetaan funktio-objekti (osoite säikeen suorituksen alkupaikkaan).
Lisäksi codice_6 avainsanalla voi määritellä säiekohtaisia muuttujia. 
Synkronointitukea on atomisien operaatioiden lisäksi käytettävissä luokilla codice_7 ja codice_8.
Synkronointiin on myös aikarajoitettu codice_9 sekä rekursion salliva codice_10 ja näiden yhdistelmä codice_11.
Tuple-tyyppi.
Tuple on template-pohjainen vaihtoehto C-kielen codice_12-tyypille.
typedef std::tuple &lt;int, string, double&gt; tTuple;
tTuple data(42, "heippa", 3.14);
Vastaava tietotyyppi on aiemmin esiintynyt esimerkiksi rinnakkaisohjelmointiin kehitetyssä Alef -kielessä.
Älyosoittimet.
Standardikirjastoon on lisätty älyosoittimia eri tarkoituksiin:
Siirto-operaattorit.
Tyypillisen "copy-delete" menettelyn sijaan on mahdollista käyttää tehokkaampaa siirto-operaattoria ():
class MyContainer
// ...
MyContainer &amp; operator=(MyContainer &amp;&amp; other)
 if (this != &amp;other) 
 // ...
 return *this;
Menetelmä välttää nk. "deep-copy" toiminnon, joka voi olla raskas käytössä.