C++20
Версії мови програмування C++ |
---|
C++20 — версія стандарту ISO/IEC 14882 мови програмування C++. Слідує після C++17.[1] Комітет стандарту C++ почав працювати над C++20 в липні 2017.[2] З технічного боку стандарт було завершено[3] комітетом WG21 до зустрічі в Празі в лютому 2020,[4] остаточно затверджено 4 вересня 2020 року. Cтандарт офіційно опублікований у грудні 2020.[5]
C++20 додає більше нових можливостей ніж C++14 чи C++17.
Нові можливості мови
Нові можливості бібліотеки
- Діапазони[10]
- Атомарні розумні вказівники (
std::atomic<std::shared_ptr<T>>
таstd::atomic<std::weak_ptr<T>>
)[11][12]
Нові (і змінені) ключові слова
- новий оператор «зореліт»:
operator <=>
concept
char8_t
- тепер
explicit
може приймати вираз значення якого визначає чи буде явною функція до якої застосованоexplicit
.[13] constinit
[14]consteval
пов'язані з Корутинами
co_await
co_return
co_yield
пов'язані з Модулями
import
(як ідентифікатори з особливим значенням)module
(як ідентифікатори з особливим значенням)requires
export
(нове значення)
нові атрибути[15]
[[likely]]
[[unlikely]]
[[no_unique_address]]
Видалені та заборонені можливості
Видалені можливості:[16]
- Заголовкові файли породжені від заголовкових файлів 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
.
Заборонені можливості:
Можливості опубліковані як технічні специфікації
Зміни відкладені до наступних стандартів
- Контракти — утворено нову робочу групу (SG21) для роботи над новою пропозицією[23]
- Рефлекcія[24][25]
- Метакласи[26]
- Виконавці[27]
- Мережеві розширення,[28][29] включаючи async, базові I/O служби, таймери, буфери і буферо-орієнтовані потоки, сокети і Інтернет протоколи (заблоковані виконавцями)
- Властивості[30]
- Розширення для
future
[31]
Історія розвитку стандарту
липень 2017
Наступне було проголосовано для включення в чорновик стандарту C++20 в липні 2017:[32]
struct A { int x; int y; int z; };
A a{.y = 2, .x = 1}; // помилка; порядок ініціалізаторів не відповідає порядку в означені
A b{.x = 1, .z = 2}; // добре, b.y ініціалізоване в 0
[=, this]
захоплення лямбди[34]- Шаблонний список параметрів лямбди[35]
std::make_shared
іstd::allocate_shared
для масивів[36]
листопад 2017 (Альбукерке)
- тришляхове порівняння використовуючи оператор-зореліт,
<=>
- ініціалізація додаткової змінної всередині діапазонного
for
[37]
for (T thing = foo(); auto& x : thing.items()) { /* ... */ } // Добре
- лямбди в необчислюваних контекстах (наприклад, в
decltype
)[38][39] - конструйовні за замовчанням і з можливістю присвоювання лямбди без стану.[38][40] Це робить лямбди без стану більше схожими на функціональні об'єкти
- дозволити розкриття паку в ініціалізаційному захоплені лямбди[38][41], як-от
[args=std::move(args)...]() -> ...
- рядкові літерали як параметри не типи шаблонів[38][42]
- атомарні вказівники (такі як
std::atomic<shared_ptr<T>>
іstd::atomic<weak_ptr<T>>
)[43] std::to_address
переводить вказівник, в тому числі розумний, в сирий вказівник[44]
березень 2018 (Джексонвіль)
- в деяких ситуаціях прибирає потребу в
typename
[45] - нові стандартні атрибути
[[no_unique_address]]
,[46][[likely]]
і[[unlikely]]
[47] - доповнення до календаря і часових поясів у
<chrono>
[48] std::span
, надає вид на масив (аналогічний доstd::string_view
, алеspan
не тільки для читання).[49] Зазвичай втілюється за допомогою вказівника на початок і розміру.- заголовковий файл
<version>
[50]
червень 2018 (Раперсвіль)
Зміни, що їх було внесено в робочу чернетку C++20 під час літньої зустрічі в червні 2018 в Раперсвілі включають:[51]
- контракти було відкладено до пізніших стандартів[52]
- макроси тестування наявності функціональності[53]. Наприклад,
__cpp_lib_coroutine
,__cpp_concepts
- побітове перетворення представлень об'єктів менш багатослівне ніж
memcpy()
і придатніше для використання внутрішніх можливостей компілятора[54]. Див.std::bit_cast
- умовний
explicit
, що дозволяє модифікатору залежати від логічного виразу[55]
template<class T> struct wrapper {
template<class U> explicit(!std::is_convertible_v<U, T>) wrapper(U const& u) : t_(u) {}
T t_;
};
- constexpr віртуальні функції[56]
листопад 2018 (Сан-Дієго)
лютий 2019 (Кона)
липень 2019 (Кельн)
Зміни внесені до робочої чернетки C++20 під час літньої зустрічі в липні 2019 (Кельн) включають:[60][61][62]
- контракти було виключено (дивись зміни відкладені до наступних стандартів)[63]
- використання оператора коми в виразах для індексів було позначено небажаним[17]
a[b,c]; // небажано
a[(b,c)]; // прийнятно
- (більшість з)
volatile
було позначено небажаними[18] - доповнення для constexpr (трівіальна ініціалізація за замовчанням,[64] дозволяє вбудований асемблер у випадках, коли він не обчилюється під час компіляції[65])
листопад 2019 (Белфаст)
Примітки
- ↑ The next standard after C++17 will be C++20., by Herb Sutter
- ↑ Current Status : Standard C++.
- ↑ Sutter, Herb (1 жовтня 2019). P1000R3: C++ IS schedule (PDF). Процитовано 13 лютого 2020.
- ↑ Dusíková, Hana (6 листопада 2019). N4817: 2020 Prague Meeting Invitation and Information (PDF). Процитовано 13 лютого 2020.
{{cite web}}
: Обслуговування CS1: Сторінки з параметром url-status, але без параметра archive-url (посилання) - ↑ ISO/IEC 14882:2020.
- ↑ а б P0606R0: Concepts Are Ready (PDF).
- ↑ P1141R1 - Yet another approach for constrained declarations.
- ↑ N4720: Working Draft, Extensions to C++ for Modules (PDF).
- ↑ N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines (PDF).
- ↑ The One Ranges Proposal (PDF).
- ↑ Meredith, Alisdair; Sutter, Herb. Revising atomic_shared_ptr for C++20.
- ↑ P1664R0: Add wait/notify to atomic<shared_ptr<T>>.
- ↑ explicit specifier - cppreference.com. en.cppreference.com. Процитовано 4 серпня 2019.
- ↑ P1143R2: Adding the constinit keyword. www.open-std.org. 20 липня 2019. Процитовано 20 липня 2019.
- ↑ attribute specifier sequence(since C++11) - cppreference.com. en.cppreference.com. Процитовано 4 серпня 2019.
- ↑ Working Draft, Standard for Programming Language C++ (Annex C, §C.1) (PDF).
- ↑ а б P1161R2: Deprecate uses of the comma operator in subscripting expressions. www.open-std.org. Процитовано 20 липня 2019.
- ↑ а б P1152R4: Deprecating volatile. www.open-std.org. 20 липня 2019. Процитовано 20 липня 2019.
- ↑ C++ Extensions for Parallelism Version 2.
- ↑ Task Blocks.
- ↑ C++ Extensions for Reflection.
- ↑ C++ Extensions for Networking.
- ↑ Sutter, Herb (20 липня 2019). Trip report: Summer ISO C++ standards meeting (Cologne). Sutter’s Mill (англ.). Процитовано 21 липня 2019.
- ↑ Reflections on the reflection proposals - Meeting C++. meetingcpp.com (англ.). Процитовано 30 червня 2017.
- ↑ Static reflection. www.open-std.org. Процитовано 10 листопада 2018.
- ↑ Herb Sutter. Metaclasses (PDF).
- ↑ A Unified Executors Proposal for C++. www.open-std.org. Процитовано 24 лютого 2019.
- ↑ N4771: Working Draft, C++ Extensions for Networking (PDF).
- ↑ ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking.
- ↑ A General Property Customization Mechanism. www.open-std.org. Процитовано 24 лютого 2019.
- ↑ A Unified Futures Proposal for C++.
- ↑ Herb Sutter. Trip report: Summer ISO C++ standards meeting (Toronto).
- ↑ Tim Shen; Richard Smith. Designated Initialization Wording.
- ↑ Thomas Köppe. Allow lambda capture [=, this].
- ↑ Familiar template syntax for generic lambdas.
- ↑ Extending make_shared to Support Arrays.
- ↑ Range-based for statements with initializer.
- ↑ а б в г Trip Report: C++ Standards Meeting in Albuquerque, November 2017. There's Waldo! (амер.). 20 листопада 2017. Процитовано 11 грудня 2017.
- ↑ Wording for lambdas in unevaluated contexts (PDF).
- ↑ Default constructible and assignable stateless lambdas (PDF).
- ↑ Pack expansion in lambda init-capture. www.open-std.org. Процитовано 11 грудня 2017.
- ↑ String literals as non-type template parameters (PDF).
- ↑ Meredith, Alisdair; Sutter, Herb. Revising atomic_shared_ptr for C++20. JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP. ISO. Процитовано 27 грудня 2018.
- ↑ Utility to convert a pointer to a raw pointer.
- ↑ Nina Ranns; Daveed Vandevoorde. Down with typename!.
- ↑ Language support for empty objects.
- ↑ Proposed wording for likely and unlikely attributes (Revision 5).
- ↑ Howard E. Hinnant; Tomasz Kamiński. Extending <chrono> to Calendars and Time Zones.
- ↑ Neil MacIntosh; Stephan T. Lavavej. span: bounds-safe views for sequences of objects.
- ↑ Alan Talbot. <version>.
- ↑ Герб Сатер. Trip report: Summer ISO C++ standards meeting (Rapperswil).
- ↑ Support for contract based programming in C++. www.open-std.org. Процитовано 10 листопада 2018.
- ↑ Integrating feature-test macros into the C++ WD. www.open-std.org. Процитовано 10 листопада 2018.
- ↑ Bit-casting object representations. www.open-std.org. Процитовано 10 листопада 2018.
- ↑ explicit(bool). www.open-std.org. Процитовано 13 листопада 2018.
- ↑ Allowing Virtual Function Calls in Constant Expressions. www.open-std.org. Процитовано 11 березня 2019.
- ↑ N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines (PDF).
- ↑ N4637: Working Draft, Extensions to C++ for Modules (PDF).
- ↑ Clang 5 documentation on Modules.
- ↑ r/cpp - 2019-07 Cologne ISO C++ Committee Trip Report — 🚀 The C++20 Eagle has Landed 🚀 (C++20 Committee Draft shipped; Contracts Moved From C++20 to a Study Group; `std::format` in C++20; C++20 Synchronization Library). reddit (англ.). Процитовано 15 вересня 2019.
- ↑ Botond Ballo. Trip Report: C++ Standards Meeting in Cologne, July 2019.
- ↑ Sutter, Herb. Trip report: Summer ISO C++ standards meeting (Cologne).
- ↑ Josuttis, Nicolai. P1823R0: Remove Contracts from C++20 (PDF).
- ↑ Permitting trivial default initialization in constexpr contexts (PDF).
- ↑ P1668R1: Enabling Constexpr Intrinsics By Permitting Unevaluated inline-asm in Constexpr Functions. www.open-std.org. Процитовано 20 липня 2019.
Посилання
- Офіційна версія C++20 стандарту: ISO/IEC 14882:2020
- Чорнова версія стандарту: N4860
- Відмінності між C++17 та C++20 DIS
- Версія бібліотеки Діапазони від Еріка Ніеблера: range-v3
Це незавершена стаття про мови програмування. Ви можете допомогти проєкту, виправивши або дописавши її. |