Výbor ISO pro standardizaci jazyka C++ schválený mezinárodní standard "C ++ 20". Schopnosti uvedené ve specifikaci, s výjimkou ojedinělých případů, podporováno v kompilátorech GCC, Zvonit и Microsoft Visual C ++. V rámci projektu jsou implementovány standardní knihovny podporující C++20 zesílení.
Schválená specifikace bude v následujících dvou měsících ve fázi přípravy dokumentu k publikaci, kdy se bude pracovat na redakční opravě pravopisných chyb a překlepů. Začátkem listopadu bude výsledný dokument zaslán ISO ke zveřejnění pod formálním názvem ISO/IEC 14882:2020. Mezitím již komise začala pracovat na dalším standardu C++23 (C++2b) a na svém příštím virtuálním setkání zváží možné varianty. inovace.
Přidány "koncepty", rozšíření šablon, které umožňují definovat sadu požadavků na parametry šablony, které v době kompilace omezují sadu argumentů, které lze přijmout jako parametry šablony. Tyto koncepty lze použít k zamezení logických nesrovnalostí mezi vlastnostmi datových typů použitých v šabloně a vlastnostmi datových typů vstupních parametrů.
šablona
koncept RovnostPorovnatelné = vyžaduje(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
};
Přijato rozšíření pro práci s moduly, které lze použít místo hlavičkových souborů. Moduly poskytují nový způsob, jak organizovat zdrojový kód na základě definování hranic komponent, bez zahrnutí hlavičkových souborů pomocí „#include“.
Makro __VA_OPT__ pro adaptivní rozšíření proměnných maker v závislosti na přítomnosti tokenů v argumentu proměnné.
Podpora operátoru "" pro třícestné srovnání.
Podpora výchozích inicializátorů prvků pro bitová pole.
Schopnost lambda zachytit "*toto" výrazy.
struct int_value {
int n = 0;
auto getter_fn() {
//ŠPATNÝ:
// return [=]() { return n; };
// DOBRÝ:
return [=, *toto]() { return n; };
}
};
Volání prvků ukazatelem (Pointer-to-member) pomocí ukazatelů na dočasné objekty definované pomocí výrazu „const &“.
Operátor delete s destruktorem popsaným v dokumentu P0722 R1.
get_foo(); // používá implicitní konstruktor
get_foo ();
Neperzistentní výrazy lambda s konstruktorem.
Povolení syntaxe šablony pro výrazy lambda („auto f = [] (std::vektor proti)").
Schopnost používat řetězcové literály v parametrech šablony.
Podpora inicializační syntaxe ve stylu C – pole, která nejsou explicitně uvedena v inicializačním seznamu, jsou ve výchozím nastavení inicializována.
struktura A {
intx;
int y;
int z = 123;
};
A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2
Podpora pro prázdné členy datové struktury.
Podpora pro pravděpodobné a nepravděpodobné atributy pro informování optimalizátoru o pravděpodobnosti spuštění podmíněného konstruktu („[[pravděpodobné]], pokud (náhodné > 0) {“).
Schopnost používat rozsahy k inicializaci hodnot proměnných ve smyčce „for“.
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
Automatický výpočet velikosti pole v novém („new double[]{1,2,3}“);
Atribut „[[no_unique_address]]“, ve kterém proměnné bez dat nezabírají místo.
Atomové ukazatele (std::atomic > a std::atomic >).
Schopnost volat virtuální funkce v podmíněných výrazech.
Podpora okamžitých funkcí, které mohou pracovat pouze s konstantami.
consteval int sqr(int n) {
návrat n * n;
}
constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // CHYBA: 'x' nelze použít jako konstantu
Možnost použití constexpr s virtuálními funkcemi („constexpr virtual int f() const { return 2; }“).
Ve standardní knihovně:
Přidána podpora pro typ char8_t pro řetězce UTF-8.
Přidán bit hlavičkových souborů (bitové operace) a verze.
Nyní je možné kontrolovat předponu a příponu řetězců (začíná_čím, končí_čím).
Přidány vlastnosti std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible a std::type_identity traits.
Přidány funkce std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated a std::assume_aligned.
Přidána podpora pro pole do std::make_shared.
Přidána funkce std::to_array pro převod objektů podobných poli na std::array.
Pohodlnější syntaxe výčtu:
enum class rgba_color_channel { červená, zelená, modrá, alfa };
std::string_view to_string(rgba_color_channel můj_kanál) {
switch (my_channel) {
pomocí enum rgba_color_channel;
případ červená: návrat "červená";
případ zelená: návrat "zelená";
případ modrý: návrat "modrý";
případ alfa: návrat "alfa";
}
}
V indexech je z důvodu nedefinovaného chování použití operace „,“ („a[b,c]“) zakázáno. Podpora většiny operací s proměnnými deklarovanými pomocí klíčového slova volatile byla ukončena, včetně operací „++“ a „—“ se standardními typy.
Snížil se počet situací, ve kterých je vyžadováno "typename" k označení přítomnosti typu.