Затверджено стандарт C++20

Комітет ISO зі стандартизації мови C++ затвердила міжнародний стандарт «C ++ 20«. Представлені у специфікації можливості, за винятком поодиноких випадків, підтримуються у компіляторах GCC, Кланг и Microsoft Visual C ++. Стандартні бібліотеки, що підтримують C++20, реалізовані в рамках проекту Підвищення.

У наступні два місяці затверджена специфікація перебуватиме на стадії підготовки документа до публікації, на якій буде проведено роботу з редакторської правки орфографічних помилок та друкарських помилок. На початку листопада результуючий варіант документа буде направлений ISO для публікації під формальним ім'ям ISO/IEC 14882:2020. Тим часом, Комітет уже приступив до роботи над наступним стандартом C++23 (C++2b) і на найближчій віртуальній нараді розгляне можливі нововведення.

Основні Особливості C ++ 20 (приклади коду):

  • Додані «концепції», розширення шаблонів, що дозволяють визначити набір вимог до параметрів шаблону, які під час компіляції обмежують набір аргументів, які можуть бути прийняті як параметри шаблону. Концепції можна застосовувати для того, щоб уникнути логічних невідповідностей між властивостями типів даних, що використовуються всередині шаблону, та властивостями типів даних вхідних параметрів.

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

  • До складу прийнято розширення для роботи з модулями, які можна використовувати замість заголовних файлів. Модулі надають новий спосіб організації вихідних текстів виходячи з визначення меж компонентів, без підключаються через «#include» заголовних файлів.
  • Макрос __VA_OPT__ для адаптивного розкриття варіативних макросів залежно від наявності токенів у варіативному аргументі.
  • Підтримка оператора для тристороннього порівняння.
  • Підтримка ініціалізаторів за замовчуванням для бітових полів.
  • Можливість лямбда-захоплення виразів "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() {
    повернення f;
    }

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

  • Лямбда-вираження з конструктором, що не зберігаються.
  • Допустимість використання синтаксису шаблонів для ламбда-виразів («auto f = [] (std::vector v)»).
  • Можливість використання рядкових літералів у параметрах шаблону.
  • Підтримка синтаксису ініціалізації у стилі Сі — явно не перелічені у списку ініціалізації поля, що ініціалізуються за замовчуванням.

    структура A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2

  • Підтримка порожніх членів структури даних.
  • Підтримка атрибутів likely та unlikely для інформування оптимізатора про можливість спрацювання умовної конструкції («[[likely]] if (random > 0) {«).
  • Можливість використання діапазонів для ініціалізації значень змінної у циклі «for»

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

  • Автоматичне обчислення розміру масиву в new («new double [] {1,2,3}»);
  • Атрибут "[[no_unique_address]]" при якому змінні без даних не займають місця.
  • Атомарні покажчики (std::atomic > та std::atomic >).
  • Можливість виклику віртуальних функцій в умовних виразах.
  • Підтримка швидких (immediate) функцій, які можуть працювати лише з константами.

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

    constexpr int = sqr(100); // OK
    int x = 100;
    int r2 = sqr (x); // ERROR: 'x' не може використовуватися як константа

  • Можливість застосування constexpr з віртуальними функціями (constexpr virtual int f() const { return 2; })).
  • У стандартній бібліотеці:
    • Додано підтримку типу char8_t для рядків UTF-8.
    • Додані заголовні файли bit (бітові операції) та version.
    • З'явилася можливість перевірки префікса та суфікса рядків (starts_with, ends_with).
    • Додані типажі std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible та std::type_identity.
    • Додані функції std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated та std::assume_aligned.
    • У std::make_shared додано підтримку масивів.
    • Додана функція std::to_array для перетворення схожих на масив об'єктів у std::array.
  • Більш зручний синтаксис перерахувань:

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

  • В індексах через невизначену поведінку заборонено використання операції «,» («a[b,c]»). Припинено підтримку більшості операцій зі змінними, оголошеними з ключовим словом volatile, у тому числі заборонено операції «++» та «—» зі стандартними типами.
  • Скорочено кількість ситуацій, у яких потрібна вказівка ​​«typename» для інформування наявності типу.

Джерело: opennet.ru

Додати коментар або відгук