C++ уже несколько десятилетий занимает лидирующие позиции в мире языков программирования, а появление C++20 открыло новую эру возможностей. В этой статье освещаются основные различия между C++14 и C++20 и демонстрируется, как эти изменения можно использовать в реальных приложениях.
- Концепции
C++20 представил концепции, которые представляют собой способ выразить требования к шаблону более четко, чем это было возможно в C++14. Концепция — это набор требований, состоящий из допустимых выражений, требований к типам и функций constexpr.
Например, в C++14 вы можете написать шаблонную функцию, например:
шаблон‹название типа T›
Т добавить(Та, Тб) {
. вернуть а + б;
}
В C++20 вы можете использовать понятия, чтобы быть более конкретным:
шаблон‹название типа T›
concept is_arithmetic = std::is_arithmetic_v‹T›;
шаблон‹is_arithmetic T›
Т добавить(Та, Тб) {
. вернуть а + б;
}
Это гарантирует, что add может вызываться только с арифметическими типами, обеспечивая более надежную безопасность типов.
2. Сопрограммы
Корутины, новая форма функций, теперь изначально поддерживаются в C++20. Их можно приостанавливать и возобновлять, в отличие от обычных функций, которые выполняются до завершения. Это чрезвычайно полезно в асинхронном программировании.
Например, рассмотрим асинхронное чтение из файла:
std::future‹std::string› read_file(std::string path) {
. // Некоторые асинхронные операции
}
С сопрограммами это можно записать так:
std::future‹std::string› read_file(std::string path) {
. co_return co_await async_read (путь);
}
3. Диапазоны
В C++14 алгоритмы работали с парами итераторов. С появлением C++20 у нас теперь есть Ranges, связанная функция языка, упрощающая работу с последовательностями данных.
Вместо того, чтобы писать:
std::vector‹int› vec = {1, 2, 3, 4, 5};
std::sort(vec.begin(), vec.end());
Теперь вы можете написать:
std::ranges::sort(vec);
4. Модули
C++20 предлагает новый способ изоляции и инкапсуляции кода с помощью модулей. Вместо файлов заголовков и исходных файлов у нас теперь есть лучший способ управления зависимостями.
Вместо этого (С++ 14):
// mymath.h
#прагма один раз
int добавить (int a, int b);
// mymath.cpp
#include «mymath.h»
int добавить (int a, int b) {
. вернуть а + б;
}
У нас есть это (С++ 20):
// mymath.ixx
модуль экспорта mymath;
экспортировать int add (int a, int b) {
. вернуть а + б;
}
5. Календарь и часовой пояс
C++20 представляет новый ‹хроно›, который поддерживает функции календаря и часового пояса. Благодаря новому стандарту выполнение задач, связанных со временем, стало более простым:
#include ‹хроно›
auto now = std::chrono::system_clock::now();
auto now_utc = std::chrono::zoned_time(std::chrono::utc, сейчас);
std::cout ‹‹ now_utc ‹‹ ‘\n’;
При переходе с C++14 на C++20 появилось несколько новых функций, которые помогут вам писать более эффективный, удобочитаемый и безопасный код. Принятие этих изменений позволит вам в полной мере использовать мощь и выразительность современного C++. Удачного кодирования!
Рекомендации
1. Страуструп, Б., (2020). «Язык программирования С++». Аддисон-Уэсли Профессионал.
2. Аллен А. (2021). «Прыжок в C++». Cprogramming.com.