Топ питань
Часова шкала
Чат
Перспективи

C++20

З Вікіпедії, вільної енциклопедії

Remove ads

C++20 — версія стандарту ISO/IEC 14882 мови програмування C++. Слідує після C++17.[1] Комітет стандарту C++ почав працювати над C++20 в липні 2017.[2] З технічного боку стандарт було завершено[3] комітетом WG21 до зустрічі в Празі в лютому 2020,[4] остаточно затверджено 4 вересня 2020 року. Стандарт офіційно опублікований у грудні 2020.[5]

C++20 додає більше нових можливостей ніж C++14 чи C++17.

Remove ads

Нові можливості мови

Узагальнити
Перспектива

Співпрограми

До версії C++20 можливість роботи зі співпрограмами була реалізована на рівні бібліотек, зокрема Boost.Coroutine, Boost.Coroutine2 та іншими. У версії C++20 на рівні мови та компілятора була додана підтримка безстекових співпрограм. Зокрема, були додані нові ключові слова co_return, co_await та co_yield, але підтримка співпрограм у стандартній бібліотеці була мінімальна[10], стандарт радше визначив каркас для роботи зі співпрограмами[11]. Тому, для зручності розробників, були створені бібліотеки класів для поширених видів співпрограм: cppcoro, libcoro, QCoro, та інші[10].

Стандартом передбачено, що співпрограма може віддати управління в одному потоці виконання, а бути відновлена — в іншому[12].

В стандарті C++23 до стандартної бібліотеки був доданий тип generator, який полегшує створення генераторів послідовностей на основі співпрограм сумісних з доданими в стандарті C++20 діапазонами[13].

Таким чином, генератор послідовності Фібоначчі мовою стандарту C++23 може мати такий вигляд:

#include <generator>
#include <ranges>
#include <iostream>
 
std::generator<int> fib() {
    co_yield 0;
    auto a = 0;
    auto b = 1;
    for (auto n : std::views::iota(0)) {  
        auto next = a + b;
        a = b;
        b = next;
        co_yield next;
    }
}

int main() {
    for (auto f : fib() | std::views::take(10)) {
        std::cout << f << " ";
    }
}
Remove ads

Нові можливості бібліотеки

  • Діапазони (англ. ranges)[14]
  • Атомарні розумні вказівники (std::atomic<std::shared_ptr<T>> та std::atomic<std::weak_ptr<T>>)[15][16]

Нові (і змінені) ключові слова

  • новий оператор «зореліт» для тришляхового порівняння: operator <=>
  • concept
  • char8_t
  • тепер explicit може приймати вираз значення якого визначає чи буде явною функція до якої застосовано explicit.[17]
  • constinit[18]
  • consteval

Пов'язані зі співпрограмами

  • co_await
  • co_return
  • co_yield

Пов'язані з модулями

  • import (як ідентифікатори з особливим значенням)
  • module (як ідентифікатори з особливим значенням)
  • requires
  • export (нове значення)

Нові атрибути[19]

  • [[likely]]
  • [[unlikely]]
  • [[no_unique_address]]

Видалені та заборонені можливості

Видалені можливості:[20]

  • Заголовкові файли породжені від заголовкових файлів C <ccomplex>, <ciso646>, <cstdalign>, <cstdbool> і <ctgmath>, так як немає сенсу їх використовувати в C++. Відповідні <*.h> все ще підтримуються для сумістності з C.
  • Використання throw() для позначення динамічної специфікації виключень функцій.
  • Деякі можливості бібліотеки які раніше були заборонені тепер видалені: std::uncaught_exception, std::raw_storage_iterator, std::is_literal_type, std::is_literal_type_v, std::result_of і std::result_of_t.

Заборонені можливості:

  • використання оператора коми в виразах для індексів[21]
  • (більшість з) volatile[22]
Remove ads

Можливості опубліковані як технічні специфікації

  • Паралелізм ТС v2[23] (включаючи блоки задач[24])
  • Рефлексія ТС v1[25]
  • Мережеві розширення ТС v1[26]

Зміни відкладені до наступних стандартів

  • Контракти — утворено нову робочу групу (SG21) для роботи над новою пропозицією[27]
  • Рефлексія[28][29]
  • Метакласи[30]
  • Виконавці[31]
  • Мережеві розширення,[32][33] включаючи async, базові I/O служби, таймери, буфери і буферо-орієнтовані потоки, сокети і Інтернет протоколи (заблоковані виконавцями)
  • Властивості[34]
  • Розширення для future[35]

Історія розвитку стандарту

Узагальнити
Перспектива

липень 2017

Наступне було проголосовано для включення в чорновик стандарту C++20 в липні 2017:[36]

struct A { int x; int y; int z; };
A a{.y = 2, .x = 1}; // помилка; порядок ініціалізаторів не відповідає порядку в означені
A b{.x = 1, .z = 2}; // добре, b.y ініціалізоване в 0
  • [=, this] захоплення лямбди[38]
  • Шаблонний список параметрів лямбди[39]
  • std::make_shared і std::allocate_shared для масивів[40]

листопад 2017 (Альбукерке)

for (T thing = foo(); auto& x : thing.items()) { /* ... */ } // Добре
  • лямбди в необчислюваних контекстах (наприклад, в decltype)[42][43]
  • конструйовні за замовчанням і з можливістю присвоювання лямбди без стану.[42][44] Це робить лямбди без стану більше схожими на функціональні об'єкти
  • дозволити розкриття паку в ініціалізаційному захоплені лямбди[42][45], як-от [args=std::move(args)...]() -> ...
  • рядкові літерали як параметри не типи шаблонів[42][46]
  • атомарні вказівники (такі як std::atomic<shared_ptr<T>> і std::atomic<weak_ptr<T>>)[47]
  • std::to_address переводить вказівник, в тому числі розумний, в сирий вказівник[48]

березень 2018 (Джексонвіль)

  • в деяких ситуаціях прибирає потребу в typename[49]
  • нові стандартні атрибути [[no_unique_address]],[50] [[likely]] і [[unlikely]][51]
  • доповнення до календаря і часових поясів у <chrono>[52]
  • std::span, надає вид на масив (аналогічний до std::string_view, але span не тільки для читання).[53] Зазвичай втілюється за допомогою вказівника на початок і розміру.
  • заголовковий файл <version> [54]

червень 2018 (Раперсвіль)

Зміни, що їх було внесено в робочу чернетку C++20 під час літньої зустрічі в червні 2018 в Раперсвілі включають:[55]

  • контракти було відкладено до пізніших стандартів[56]
  • макроси тестування наявності функціональності[57]. Наприклад, __cpp_lib_coroutine, __cpp_concepts
  • побітове перетворення представлень об'єктів менш багатослівне ніж memcpy() і придатніше для використання внутрішніх можливостей компілятора[58]. Див. std::bit_cast
  • умовний explicit, що дозволяє модифікатору залежати від логічного виразу[59]
template<class T> struct wrapper { 
  template<class U> explicit(!std::is_convertible_v<U, T>) wrapper(U const& u) : t_(u) {} 
  T t_; 
};
  • constexpr віртуальні функції[60]

листопад 2018 (Сан-Дієго)

лютий 2019 (Кона)

  • Coroutines[61]
  • Модулі.[62] Уже підтримуються Clang 5[63] та Visual Studio 2015 Update 1

липень 2019 (Кельн)

Зміни внесені до робочої чернетки C++20 під час літньої зустрічі в липні 2019 [Архівовано 24 листопада 2019 у Wayback Machine.] (Кельн) включають:[64][65][66]

    a[b,c];   // небажано
    a[(b,c)]; // прийнятно
  • (більшість з) volatile було позначено небажаними[22]
  • доповнення для constexpr (трівіальна ініціалізація за замовчанням,[68] дозволяє вбудований асемблер у випадках, коли він не обчилюється під час компіляції[69])

листопад 2019 (Белфаст)

Remove ads

Примітки

Посилання

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads