Топ питань
Часова шкала
Чат
Перспективи
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]
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
Нові можливості бібліотеки
Нові (і змінені) ключові слова
- новий оператор «зореліт» для тришляхового порівняння:
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
.
Заборонені можливості:
Remove ads
Можливості опубліковані як технічні специфікації
Зміни відкладені до наступних стандартів
- Контракти — утворено нову робочу групу (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
листопад 2017 (Альбукерке)
- тришляхове порівняння використовуючи оператор-зореліт,
<=>
- ініціалізація додаткової змінної всередині діапазонного
for
[41]
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 (Кона)
липень 2019 (Кельн)
Зміни внесені до робочої чернетки C++20 під час літньої зустрічі в липні 2019 [Архівовано 24 листопада 2019 у Wayback Machine.] (Кельн) включають:[64][65][66]
- контракти було виключено (дивись зміни відкладені до наступних стандартів)[67]
- використання оператора коми в виразах для індексів було позначено небажаним[21]
a[b,c]; // небажано
a[(b,c)]; // прийнятно
листопад 2019 (Белфаст)
Remove ads
Примітки
Посилання
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads