ISO komitee C++ keele standardimiseks rahvusvaheline standard "". Spetsifikatsioonis esitatud võimalused, välja arvatud üksikud juhud, kompilaatorites , ja . C++20 standardi toetavad raamatukogud on rakendatud projekti .
Järgmise kahe kuu jooksul kinnitatud spetsifikatsioon valmib dokumentide avaldamiseks, kus viiakse läbi toimetamisprotsess õigekirja- ja trükivigade parandamiseks. Novembri alguses saadetakse lõplik dokument ISO-le avaldamiseks formaalse nimega ISO/IEC 14882:2020. Samal ajal on komitee juba asunud tööle järgmise standardi C++23 (C++2b) kallal ja lähitulevikus vaadatakse järgmisi .
():
- Lisatud on "kontseptsioonid", mallide laiendused, mis võimaldavad määrata nõuete kogumi malliparameetritele, mis kompileerimise ajal piiravad argumentide kogumit, mida saab malliparameetritena kasutada. Kontseptsioone saab kasutada, et vältida loogilisi vastuolusid andmetüüpide omaduste vahel, mis on kasutusel mallis, ja sissetulevate parameetrite andmetüüpide omaduste vahel.
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - Nõutud on moodulite tööks, mida saab kasutada pealkirjafailide asemel. Moodulid pakuvad uut viisi lähtekoodide korraldamiseks, tuginedes komponentide piiride määratlemisele, ilma "#include" pealkirjafailide juurde sidumata.
- Maksu __VA_OPT__ adaptiivseks avamiseks variatiivsest makros sõltuvalt variatiivsete argumentide kohalolekust.
- Toetust operaatorile "" kolmikvõrdlemiseks.
- Toetatakse vaikeelementide initsialisaatoreid bitiväljade jaoks.
- Võimalus lambda-sidumisel väljendite "*this" kasutamiseks.
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };// GOOD:
return [=, *this]() { return n; };
}
}; - Elementide kutsumine näitajate (Pointer-to-member) kaudu, kasutades "const &" kaudu määratud ajutiste objektide näitajaid.
- Destruktoriga delete operaator, nagu on kirjeldatud dokumendis .
- Klassidele on lubatud kasutada ilma tüübita malliparameetreid.
struct foo {
foo() = default;
constexpr foo(int) {}
};template
auto get_foo() {
return f;
}get_foo(); // kasutab varjatud konstruktorit
get_foo(); - Mittekasutatavad lambda-väljendid konstruktoriga.
- Mallide süntaksi kasutamise lubatavus lambda-väljendites («auto f = [<typename T>(std::vector<T> v)»).
- Stringliteraalide kasutamise võimalus malliparametrites.
- C-stiilis initsialiseerimise süntaksi tugi - nimetamata initsialiseerimisloendis olevad väljad initsialiseeritakse vaikimisi.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- Tühjade andmestruktuuri liikmete tugi.
- Tugi atribuutidele likely ja unlikely, et informeerida optimeerijat tingimuslausete tõenäosuse kohta («[[likely]] if (random > 0) {«).
- Vahemike kasutamise võimalus muutujate väärtuste initsialiseerimiseks tsüklis «for»
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
- Massi suuruse automaatne arvutamine new-is («new double[]{1,2,3}»);
- Atribuut «[[no_unique_address]]», mille korral andmeid mitte sisaldavad muutujad ei võta ruumi.
- Atomilised näidikud (std::atomic<shared_ptr<T>> ja std::atomic<weak_ptr<T>>).
- Virtuaalsete funktsioonide kutsumise võimalus tingimuslausetes.
- Kiirete (immediate) funktsioonide tugi, mis võivad töötada ainult konstantidega.
consteval int sqr(int n) {
return n * n;
}constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // ERROR: 'x' ei saa kasutada konstandina - constexpr'i rakendamise võimalus virtuaalsetele funktsioonidele («constexpr virtual int f() const { return 2; }»).
- Standardraamatukogus:
- Lisatud tugi char8_t tüübile UTF-8 stringide jaoks.
- Lisatud päisefailid bit (bitilised operatsioonid) ja version.
- Mugavuse huvides on now võimalik kontrollida stringide eelist ja suffikse (starts_with, ends_with).
- Lisatud tüübihierarhiad std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ja std::type_identity.
- Lisatud funktsioonid std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated ja std::assume_aligned.
- std::make_sharedis on lisatud toetus massiividele.
- Lisatud funktsioon std::to_array, et muuta massiivi sarnased objektid std::array-ks.
- Mugavam süntaks loetelude jaoks:
enum class rgba_color_channel { red, green, blue, alpha };
std::string_view to_string(rgba_color_channel my_channel) {
switch (my_channel) {
using enum rgba_color_channel;
case red: return «red»;
case green: return «green»;
case blue: return «blue»;
case alpha: return «alpha»;
}
} - Indekstest on keelatud kasutada operatsiooni „,“ („a[b,c]“) määramatu käitumise tõttu. Tugi enamiku volatile märksõnaga deklareeritud muutuja operatsioonide jaoks on lõpetatud, sealhulgas on keelatud operatsioonid „++“ ja „—“ tavaliste tüüpide puhul.
- Vähendatud on olukordade arvu, kus tuleb kasutada „typename“, et teavitada tüübi olemasolust.
Allikas: opennet.ru
