C++ уже несколько десятилетий занимает лидирующие позиции в мире языков программирования, а появление C++20 открыло новую эру возможностей. В этой статье освещаются основные различия между C++14 и C++20 и демонстрируется, как эти изменения можно использовать в реальных приложениях.

  1. Концепции

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.