Standard C++20 je potrjen

ISO комитет за стандартизацию C++ езика je potrdil међународни стандард "C++20". Представљене у спецификацији могућности, осим у појединачним случајевима, подржавају се у компјутерима GCC, Clang in Microsoft Visual C++. Подржавајуће C++20 стандардне библиотеке имплементиране су у оквиру пројекта Boost.

У наредна два месеца одобрена спецификација ће бити у фази припреме документа за објављивање, на којој ће бити обављен рад на уредничком исправљању правописних грешака и штампарских грешака. Почетком новембра завршни пример документа биће послат у ISO ради објављивања под формалним именом ISO/IEC 14882:2020. У међувремену, комитет је већ започео рад на следећем стандард C++23 (C++2b) и на предстојећем виртуелном састанку разматраће могуће novosti.

Glavne značilnosti C++20 (примере кода):

  • Додане су "концепције", проширења шаблона, која омогућавају дефинисање сета захтева за параметре шаблона, који током компилације ограничавају skup аргумената који могу бити прихваћени као параметри шаблона. Концепције се могу примењивати како би се избегли логички несразмери између својстава типова података који се користе унутар шаблона и својстава типова података улазних параметара.

    template
    concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • У састав су усвојени проширења за рад са модулима, које је могуће користити уместо заглављених датотека. Модули пружају нови начин организације изворних текстова на основу дефинисања граница компоненти, без укључивања путем "#include" заглављених датотека.
  • Макрос __VA_OPT__ за адаптивно раскидање варијативних макроса у зависности од присуства токена у варијативном аргументу.
  • Подршка оператору "" за тројно поређење.
  • Подршка иницијатора елемената поDefault за битна поља.
  • Могућност лямбда-записивања израза "*this".

    struct int_value {
    int n = 0;
    auto getter_fn() {
    // BAD:
    // return [=]() { return n; };

    // GOOD:
    return [=, *this]() { return n; };
    }
    };

  • Позив елемената по указатељу (Pointer-to-member), користећи одређене преко израза "const &" указатеље на привремене објекте.
  • Оператор delete са деструктором, описан у документу P0722R1.
  • Класама је допуштено коришћење параметара шаблона без типа.

    struct foo {
    foo() = default;
    constexpr foo(int) {}
    };

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // uses implicit constructor
    get_foo();

  • Nezadržana lambda izražavanja s konstruktorom.
  • Dopustivost korištenja sintakse predložaka za lambda izražavanja («auto f = [](std::vector v)»).
  • Mogućnost korištenja string literala u parametrima predložaka.
  • Podrška za sintaksu inicijalizacije u stilu C — jasno ne navedena polja u inicijalizacijskom popisu inicijaliziraju se prema zadanim postavkama.

    struct A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2

  • Podrška za prazne članove struktura podataka.
  • Podrška za atribute likely i unlikely za informiranje optimizatora o vjerojatnosti aktiviranja uvjetne konstrukcije («[[likely]] if (random > 0) {«).
  • Mogućnost korištenja raspona za inicijalizaciju vrijednosti varijable u petlji «for»

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • Automatsko izračunavanje veličine niza u new («new double[]{1,2,3}»);
  • Attribut «[[no_unique_address]]» pri čemu varijable bez podataka ne zauzimaju prostor.
  • Atomski pokazivači (std::atomic<shared_ptr> i std::atomic<weak_ptr>).
  • Mogućnost pozivanja virtualnih funkcija u uvjetnim izrazima.
  • Podrška za brze (immediate) funkcije koje mogu raditi samo s konstantama.

    consteval int sqr(int n) {
    return n * n;
    }

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // GREŠKA: ‘x’ se ne može koristiti kao konstanta

  • Mogućnost primjene constexpr s virtualnim funkcijama («constexpr virtual int f() const { return 2; }»).
  • U standardnoj biblioteci:
    • Dodana podrška za tip char8_t za UTF-8 stringove.
    • Dodani su zaglavlja bit (bitovne operacije) i version.
    • Pojavila se mogućnost provjere prefiksa i sufiksa stringova (starts_with, ends_with).
    • Dodani tipovi std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity.
    • Dodane funkcije std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated i std::assume_aligned.
    • U std::make_shared dodana podrška za nizove.
    • Dodana funkcija std::to_array za prebacivanje objekata sličnih nizovima u std::array.
  • Povoljnija sintaksa za nabrajanja:

    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»;
    }
    }

  • V indeksih je zaradi nedoločnega obnašanja prepovedana uporaba operacije „,“ („a[b,c]“). Podpora za večino operacij z spremenljivkami, deklariranimi s ključnimi besedami volatile, je prenehana, vključno s prepovedjo operacij „++“ in „—“ s standardnimi tipi.
  • Zmanjšano je število situacij, v katerih je potrebna navedba „typename“, da se označi prisotnost vrste.

Izvor: opennet.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster