C++20
C++20 — версія стандарту ISO/IEC 14882 мови програмування C++. Слідує після C++17.[1] Комітет стандарту C++ почав працювати над C++20 в липні 2017.[2] З технічного боку стандарт було завершено[3] комітетом WG21 до зустрічі в Празі в лютому 2020,[4] остаточно затверджено 4 вересня 2020 року. Cтандарт офіційно опублікований у грудні 2020.[5]
Версії мови програмування C++ |
---|
Нові можливості бібліотеки
Нові (і змінені) ключові слова
- новий оператор «зореліт»:
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
листопад 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]
лютий 2019 (Кона)
липень 2019 (Кельн)
Зміни внесені до робочої чернетки C++20 під час літньої зустрічі в липні 2019 (Кельн) включають:[60][61][62]
- контракти було виключено (дивись зміни відкладені до наступних стандартів)[63]
- використання оператора коми в виразах для індексів було позначено небажаним[17]
a[b,c]; // небажано
a[(b,c)]; // прийнятно
Примітки
- 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. Процитовано 13 лютого 2020.
- Dusíková, Hana (6 листопада 2019). N4817: 2020 Prague Meeting Invitation and Information. Процитовано 13 лютого 2020.
- ISO/IEC 14882:2020.
- P0606R0: Concepts Are Ready.
- P1141R1 - Yet another approach for constrained declarations.
- N4720: Working Draft, Extensions to C++ for Modules.
- N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines.
- The One Ranges Proposal.
- 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).
- 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.
- A Unified Executors Proposal for C++. www.open-std.org. Процитовано 24 лютого 2019.
- N4771: Working Draft, C++ Extensions for Networking.
- 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.
- Default constructible and assignable stateless lambdas.
- Pack expansion in lambda init-capture. www.open-std.org. Процитовано 11 грудня 2017.
- String literals as non-type template parameters.
- 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.
- N4637: Working Draft, Extensions to C++ for Modules.
- 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.
- Permitting trivial default initialization in constexpr contexts.
- 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