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++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]

  • Концепти.[6]
  • Іменована ініціалізація[33] (базується на можливостях C99)
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]

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

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

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

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

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

Примітки

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

Посилання

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.