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.