С++20. Нововведення

  Юрій  | 

  Оновл. 21 Тра 2021  | 

 115

4 вересня 2020 року Міжнародна організація по стандартизації (англ. «ISO») затвердила нову версію мови C++ під назвою C++20. Ми вже раніше говорили про нововведення у версії C++11, версії C++14 і версії C++17.

Нововведення, прийняті в стандарті C++20, повинні стати великим кроком у розвитку мови С++, якими для свого часу стали нововведення стандарту C++11. Щоб зрозуміти всю суть змін C++20, дозвольте мені коротко викласти еволюцію мови С++ в історичному контексті її стандартів.

Стандарти мови C++

Мові C++ вже близько 40 років. Що ж сталося з нею за останні роки? Нижче наведена моя невеличка розповідь, в якій я постараюся акцентувати вашу увагу на ключових нововведеннях мови C++, починаючи зі стандарту C++98 і закінчуючи сьогоденням.


C++98

В кінці 1980-х років Б’ярн Страуструп і Маргарет Елліс написали свою знамениту книгу “Довідник з мови програмування C++ з коментарями” (скор. «ARM» від «Annotated C++ Reference Manual»). Випуск даної книги мав на меті дві речі. По-перше, на той момент вже існувала велика кількість незалежних реалізацій C++ — внаслідок цього книга ARM зіграла свою роль в описі можливостей мови C++. По-друге, ARM стала основою для першого стандарту мови C++: C++98 (ISO/IEC 14882). Стандарт C++98 містив кілька особливо важливих інструментів, якими ми користуємося і сьогодні: шаблони, бібліотека STL з її контейнерами і алгоритмами, рядки і потоки вводу-виводу.

C++03

Починаючи з версії C++03 (14882:2003), стандарт C++98 отримав деякі технічні виправлення, основну масу яких складали описи нюансів реалізації компіляторів для покращення сумісності і переносимості програм між системами. Можна сказати, що сама мова практично не змінилася, через що деякі автори (навіть сам Б’ярн Страуструп) оскаржують виділення даної версії в окремий стандарт, натомість розглядаючи C++03 як виправлену версію стандарту C++98. Зміни, які внеслися стандартом C++03, настільки незначні, що йому не знайшлося місця на вищенаведеній часовій шкалі. На даний момент, стандарт C++03, який включає в себе C++98, співтовариство програмістів відносить до застарілого C++.

TR1

У 2005 році відбулося щось дуже цікаве. Був опублікований так званий Технічний Звіт 1 (скор. «TR1» від англ. «Technical Report 1»). TR1 став великим кроком на шляху до C++11 і сучасного C++. TR1 (TR 19768) заснований на проекті boost, який, в свою чергу, був створений членами Комітету зі стандартизації C++. TR1 містить 13 бібліотек, які стали частиною наступного стандарту C++, наприклад: бібліотека регулярних виразів, бібліотека випадкових чисел, розумні вказівники типу std::shared_ptr і хеш-таблиці.

C++11

C++11 ознаменував собою нову епоху мови C++, але ми просто називаємо його сучасним C++. Стандарт C++11 містив велику кількість нововведень, які значним чином вплинули на C++. Наприклад, C++11 привніс компоненти з TR1, а також семантику переміщення, perfect forwarding (механізм прямих передач), варіативні шаблони і специфікатор constexpr. Але це ще не все! З появою C++11 ми вперше отримали стандартизовану модель пам’яті, яка лягла в основу реалізації багатопоточної обробки інформації.

C++14

C++14 — це невеликий стандарт мови C++, який привніс механізм блокування читання-запису, узагальнені лямбди і узагальнені constexpr-функції.

C++17

C++17 не є ні великим, ні маленьким стандартом. Він має дві відмінні риси: паралельні алгоритми STL (Parallel STL) і стандартизовану файлову систему. Бібліотека boost, представлена в C++11, також мала великий вплив і на C++17. Ми отримали від boost файлову систему і три нові типи даних: std::optional, std::variant і std::any.

C++20

Знайомтеся, «велика четвірка» стандарту C++20:

   ranges (діапазони);

   coroutines (співпрограми);

   concepts (концепції);

   modules (модулі).

Раніше я б написав «велика п’ятірка», але contracts (контракти) були викреслені із загального списку на нараді зі стандартизації в Кельні.

Нова бібліотека діапазонів (ranges) дозволяє алгоритмам напряму працювати з контейнерами, комбінувати алгоритм з символом конвеєра | і застосовувати їх до нескінченних потоків даних.

Завдяки співпрограмам (сoroutines) асинхронне програмування може стати мейнстрімом в C++. Співпрограми є основою для спільних завдань, циклів подій, нескінченних потоків даних або конвеєрів.

Введення концепцій (concepts) пов’язують з подальшим розвитком в мові С++ інструментарію, заснованого на парадигмі узагальненого програмування. Вони дозволяють вам висловити свій намір безпосередньо через систему типів даних, забезпечують відповідність використовуваних в шаблоні даних вказаному набору критеріїв і перевіряють це на початку процесу компіляції. Якщо щось піде не так, ви отримаєте коротке, але в той же час вагоме повідомлення про помилку, замість величезного списку повідомлень про помилки і попередження, які ведуть кудись углиб шаблону.

Модулі (modules) — це дуже багатообіцяючий механізм, який є новим способом поділу вихідного коду, покликаний подолати обмеження, що виникають через використання заголовкових файлів, і, врешті-решт, замінити всю систему препроцесорів. В результаті ми повинні будемо отримати більш швидкий і простий спосіб збірки пакетів.

Але це далеко не все, що є в стандарті С++20. Ось кілька додаткових нововведень:

   оператор тристороннього порівняння <=>;

   календарі та розширення часових поясів бібліотеки chrono;

   std::span як представлення масиву;

   два нових ключових слова: consteval та constinit;

   designated initializers (призначені ініціалізатори);

   constexpr-контейнери;

   рядкові літерали в якості параметрів шаблону;

   тип char8_t — стандартний тип для представлення рядків в форматі UTF-8.

Додаткові ресурси

   Возможности С++20 — нові можливості С++ в версіях від С++11 до С++20 в форматі таблиць на cppreference.

   Modern C++ Features — стаття від Anthony Calandra про нові можливості стандарту С++20.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (1 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *