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.

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

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

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

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

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

  • Контракти — утворено нову робочу групу (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 (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 (Кона)Редагувати

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

липень 2019 (Кельн)Редагувати

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

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

листопад 2019 (Белфаст)Редагувати

ПриміткиРедагувати

  1. The next standard after C++17 will be C++20. Архів оригіналу за 8 жовтня 2016. Процитовано 29 вересня 2017. , by Herb Sutter
  2. Current Status : Standard C++. Архів оригіналу за 8 вересня 2020. Процитовано 29 вересня 2017. 
  3. Sutter, Herb (1 жовтня 2019). P1000R3: C++ IS schedule. Архів оригіналу за 14 листопада 2019. Процитовано 13 лютого 2020. 
  4. Dusíková, Hana (6 листопада 2019). N4817: 2020 Prague Meeting Invitation and Information. Архів оригіналу за 29 грудня 2019. Процитовано 13 лютого 2020. 
  5. ISO/IEC 14882:2020. Архів оригіналу за 16 грудня 2020. Процитовано 5 листопада 2021. 
  6. а б P0606R0: Concepts Are Ready. Архів оригіналу за 28 березня 2017. Процитовано 29 вересня 2017. 
  7. P1141R1 - Yet another approach for constrained declarations. Архів оригіналу за 11 листопада 2018. Процитовано 5 листопада 2021. 
  8. N4720: Working Draft, Extensions to C++ for Modules. Архів оригіналу за 30 квітня 2019. Процитовано 5 листопада 2021. 
  9. N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines. Архів оригіналу за 16 травня 2017. Процитовано 29 вересня 2017. 
  10. The One Ranges Proposal. Архів оригіналу за 11 листопада 2018. Процитовано 5 листопада 2021. 
  11. Meredith, Alisdair; Sutter, Herb. Revising atomic_shared_ptr for C++20. Архів оригіналу за 4 січня 2018. Процитовано 13 березня 2020. 
  12. P1664R0: Add wait/notify to atomic<shared_ptr<T>>. Архів оригіналу за 5 листопада 2021. Процитовано 5 листопада 2021. 
  13. explicit specifier - cppreference.com. en.cppreference.com. Архів оригіналу за 21 лютого 2012. Процитовано 4 серпня 2019. 
  14. P1143R2: Adding the constinit keyword. www.open-std.org. 20 липня 2019. Архів оригіналу за 20 серпня 2019. Процитовано 20 липня 2019. 
  15. attribute specifier sequence(since C++11) - cppreference.com. en.cppreference.com. Архів оригіналу за 5 липня 2012. Процитовано 4 серпня 2019. 
  16. Working Draft, Standard for Programming Language C++ (Annex C, §C.1). Архів оригіналу за 27 квітня 2020. Процитовано 4 листопада 2021. 
  17. а б P1161R2: Deprecate uses of the comma operator in subscripting expressions. www.open-std.org. Архів оригіналу за 20 липня 2019. Процитовано 20 липня 2019. 
  18. а б P1152R4: Deprecating volatile. www.open-std.org. 20 липня 2019. Архів оригіналу за 23 червня 2019. Процитовано 20 липня 2019. 
  19. C++ Extensions for Parallelism Version 2. 
  20. Task Blocks. Архів оригіналу за 19 вересня 2017. Процитовано 29 вересня 2017. 
  21. C++ Extensions for Reflection. 
  22. C++ Extensions for Networking. 
  23. Sutter, Herb (20 липня 2019). Trip report: Summer ISO C++ standards meeting (Cologne). Sutter’s Mill (англ.). Архів оригіналу за 17 квітня 2020. Процитовано 21 липня 2019. 
  24. Reflections on the reflection proposals - Meeting C++. meetingcpp.com (англ.). Архів оригіналу за 23 червня 2017. Процитовано 30 червня 2017. 
  25. Static reflection. www.open-std.org. Архів оригіналу за 22 лютого 2020. Процитовано 10 листопада 2018. 
  26. Herb Sutter. Metaclasses. Архів оригіналу за 11 листопада 2020. Процитовано 29 вересня 2017. 
  27. A Unified Executors Proposal for C++. www.open-std.org. Архів оригіналу за 20 лютого 2020. Процитовано 24 лютого 2019. 
  28. N4771: Working Draft, C++ Extensions for Networking. Архів оригіналу за 19 квітня 2020. Процитовано 8 березня 2020. 
  29. ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking. Архів оригіналу за 15 січня 2019. Процитовано 8 березня 2020. 
  30. A General Property Customization Mechanism. www.open-std.org. Архів оригіналу за 19 січня 2020. Процитовано 24 лютого 2019. 
  31. A Unified Futures Proposal for C++. 
  32. Herb Sutter. Trip report: Summer ISO C++ standards meeting (Toronto). Архів оригіналу за 6 серпня 2017. Процитовано 29 вересня 2017. 
  33. Tim Shen; Richard Smith. Designated Initialization Wording. Архів оригіналу за 15 жовтня 2017. Процитовано 29 вересня 2017. 
  34. Thomas Köppe. Allow lambda capture [=, this]. Архів оригіналу за 9 лютого 2019. Процитовано 29 вересня 2017. 
  35. Familiar template syntax for generic lambdas. Архів оригіналу за 21 листопада 2018. Процитовано 29 вересня 2017. 
  36. Extending make_shared to Support Arrays. Архів оригіналу за 6 вересня 2017. Процитовано 8 березня 2020. 
  37. Range-based for statements with initializer. Архів оригіналу за 6 квітня 2017. Процитовано 11 березня 2020. 
  38. а б в г Trip Report: C++ Standards Meeting in Albuquerque, November 2017. There's Waldo! (амер.). 20 листопада 2017. Архів оригіналу за 11 грудня 2017. Процитовано 11 грудня 2017. 
  39. Wording for lambdas in unevaluated contexts. Архів оригіналу за 12 грудня 2017. Процитовано 13 березня 2020. 
  40. Default constructible and assignable stateless lambdas. Архів оригіналу за 12 грудня 2017. Процитовано 13 березня 2020. 
  41. Pack expansion in lambda init-capture. www.open-std.org. Архів оригіналу за 14 лютого 2020. Процитовано 11 грудня 2017. 
  42. String literals as non-type template parameters. Архів оригіналу за 11 грудня 2017. Процитовано 13 березня 2020. 
  43. Meredith, Alisdair; Sutter, Herb. Revising atomic_shared_ptr for C++20. JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP. ISO. Архів оригіналу за 4 січня 2018. Процитовано 27 грудня 2018. 
  44. Utility to convert a pointer to a raw pointer. Архів оригіналу за 20 лютого 2018. Процитовано 13 березня 2020. 
  45. Nina Ranns; Daveed Vandevoorde. Down with typename!. Архів оригіналу за 22 квітня 2018. Процитовано 13 березня 2020. 
  46. Language support for empty objects. Архів оригіналу за 17 квітня 2018. Процитовано 13 березня 2020. 
  47. Proposed wording for likely and unlikely attributes (Revision 5). Архів оригіналу за 13 травня 2018. Процитовано 13 березня 2020. 
  48. Howard E. Hinnant; Tomasz Kamiński. Extending <chrono> to Calendars and Time Zones. Архів оригіналу за 13 травня 2018. Процитовано 4 квітня 2020. 
  49. Neil MacIntosh; Stephan T. Lavavej. span: bounds-safe views for sequences of objects. Архів оригіналу за 18 травня 2019. Процитовано 4 квітня 2020. 
  50. Alan Talbot. <version>. Архів оригіналу за 18 травня 2019. Процитовано 4 квітня 2020. 
  51. Герб Сатер. Trip report: Summer ISO C++ standards meeting (Rapperswil). Архів оригіналу за 23 травня 2020. Процитовано 4 квітня 2020. 
  52. Support for contract based programming in C++. www.open-std.org. Архів оригіналу за 15 січня 2020. Процитовано 10 листопада 2018. 
  53. Integrating feature-test macros into the C++ WD. www.open-std.org. Архів оригіналу за 20 липня 2018. Процитовано 10 листопада 2018. 
  54. Bit-casting object representations. www.open-std.org. Архів оригіналу за 18 серпня 2018. Процитовано 10 листопада 2018. 
  55. explicit(bool). www.open-std.org. Архів оригіналу за 20 липня 2018. Процитовано 13 листопада 2018. 
  56. Allowing Virtual Function Calls in Constant Expressions. www.open-std.org. Архів оригіналу за 11 червня 2018. Процитовано 11 березня 2019. 
  57. N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines. Архів оригіналу за 16 травня 2017. Процитовано 29 вересня 2017. 
  58. N4637: Working Draft, Extensions to C++ for Modules. Архів оригіналу за 5 липня 2017. Процитовано 29 вересня 2017. 
  59. Clang 5 documentation on Modules. Архів оригіналу за 7 жовтня 2017. Процитовано 29 вересня 2017. 
  60. 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 (англ.). Архів оригіналу за 20 квітня 2020. Процитовано 15 вересня 2019. 
  61. Botond Ballo. Trip Report: C++ Standards Meeting in Cologne, July 2019. Архів оригіналу за 26 лютого 2020. Процитовано 8 березня 2020. 
  62. Sutter, Herb. Trip report: Summer ISO C++ standards meeting (Cologne). Архів оригіналу за 17 квітня 2020. Процитовано 8 березня 2020. 
  63. Josuttis, Nicolai. P1823R0: Remove Contracts from C++20. Архів оригіналу за 13 серпня 2020. Процитовано 8 березня 2020. 
  64. Permitting trivial default initialization in constexpr contexts. Архів оригіналу за 19 жовтня 2020. Процитовано 8 березня 2020. 
  65. P1668R1: Enabling Constexpr Intrinsics By Permitting Unevaluated inline-asm in Constexpr Functions. www.open-std.org. Архів оригіналу за 19 січня 2020. Процитовано 20 липня 2019. 

ПосиланняРедагувати