С ++ 20 - C++20

C ++ 20 - это версия стандарта ISO / IEC 14882 для языка программирования C ++ . C ++ 20 заменил предыдущую версию стандарта C ++, названную C ++ 17 . Стандарт был технически доработан WG21 на встрече в Праге в феврале 2020 года, утвержден 4 сентября 2020 года и опубликован в декабре 2020 года.

Функции

C ++ 20 добавляет больше новых основных функций, чем C ++ 14 или C ++ 17 . Изменения, принятые в C ++ 20, включают:

Язык

  • концепции с кратким синтаксисом
  • модули
  • назначенные инициализаторы (на основе функции C99 и общего расширения g ++ )
  • [=, this] как лямбда-захват
  • списки параметров шаблона на лямбдах
  • трехстороннее сравнение с использованием "оператора космического корабля",operator <=>
  • Инициализация дополнительной переменной в пределах диапазона на основе forзаявления
  • лямбды в неоцененных контекстах
  • конструктивные и назначаемые лямбды без сохранения состояния по умолчанию
  • разрешить расширение пакетов в лямбда- инициализации-захвате
  • строковые литералы как параметры шаблона
  • устранение необходимости typenameв определенных обстоятельствах
  • новые стандартные атрибуты [[no_unique_address]], [[likely]]и[[unlikely]]
  • условный explicit, позволяющий явному модификатору зависеть от логического выражения
  • расширены constexpr: виртуальные функции, объединение, попытка и улов, dynamic_cast и typeid, std :: pointer_traits
  • немедленные функции с использованием constevalключевого слова new
  • целые числа со знаком теперь определены для представления с использованием двух дополнений (переполнение целого числа со знаком остается неопределенным поведением )
  • пересмотренная модель памяти
  • различные улучшения структурированных привязок (взаимодействие с лямбда-захватами, продолжительность хранения static и thread_local)
  • сопрограммы
  • using в перечислениях с областью видимости
  • constinit ключевое слово

Библиотека

  • диапазоны (Предложение One Ranges)
  • std::make_sharedи std::allocate_sharedдля массивов
  • атомарные интеллектуальные указатели (например, std::atomic<shared_ptr<T>>и std::atomic<weak_ptr<T>>)
  • std::to_address преобразовать указатель в необработанный указатель
  • добавление календаря и часового пояса к <chrono>
  • std::span, обеспечивая представление непрерывного массива (аналогично, std::string_viewно spanможет изменять указанную последовательность)
  • std::eraseи std::erase_if, упрощая стирание элементов для большинства стандартных контейнеров
  • <version> заголовок
  • std::bit_cast<>для приведения типов представлений объектов с меньшей детализацией memcpy()и большей способностью использовать внутренние компоненты компилятора
  • макросы тестирования функций
  • различные биты библиотеки constexpr
  • создание умного указателя с инициализацией по умолчанию
  • std::map::contains метод
  • битовые операции, такие как начальные / конечные нули / единицы счета и операции log2
  • std::bind_front

Новые и измененные ключевые слова

Много новых слов , добавленных (и новый "космический корабль оператор", operator <=>), такие как concept, constinit, consteval, co_await, co_return, co_yield, requires(плюс измененное значение для export) и char8_t(для UTF-8 поддержка). И explicitможет принимать выражение начиная с C ++ 20. Большинство случаев использования этого volatileключевого слова устарели.

Помимо ключевых слов, существуют идентификаторы со специальным значением , включая новые importи module.

Новые атрибуты в C ++ 20: [[likely]], [[unlikely]], и[[no_unique_address]]

Опубликовано в виде технических спецификаций

  • Parallelism TS v2 (включая блоки задач)
  • Сетевой TS v1
  • Отражение TS v1

Отнесено к более позднему стандарту

  • Контракты - сформирована новая исследовательская комиссия (ИК21) для работы над новым предложением.
  • Отражение
  • Метаклассы
  • Исполнители
  • Сетевые расширения, включая асинхронный режим, базовые службы ввода-вывода, таймеры, буферы и ориентированные на буфер потоки, сокеты и Интернет-протоколы (заблокированы исполнителями)
  • Характеристики
  • Расширенные фьючерсы

Удаленные функции и устаревание

В C ++ 20 также были удалены некоторые функции.

  • В C -derived заголовков <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.

К устаревшим функциям относятся:

  • Использование оператора запятой в выражениях нижнего индекса устарело
  • (большая часть) volatileустарела

Поддержка компилятора

  • Clang имеет частичную поддержку C ++ 20, которую можно включить с помощью параметра -std=c++20(версия 10 и более поздняя) или -std=c++2a(версия 9 и более ранняя).
  • EDG eccp начал реализацию функций C ++ 20 в версии 5.0, а начиная с версии 6.1 поддерживает большинство функций ядра C ++ 20.
  • GCC добавил частичную экспериментальную поддержку C ++ 20 в версии 8 в 2017 г. через опцию -std=c++2a. Как Clang, GCC заменить эту опцию -std=c++20в версии 10. Она также имеет возможность включить расширения GNU в дополнении к экспериментальным C ++ 20 поддержки -std=gnu++20.
  • Microsoft Visual Studio поддерживает все функции C ++ 20 через свою /std:c++latestопцию, начиная с версии 16.10.0. В /std:c++20версии 16.11.0 добавлена возможность включения режима C ++ 20.

История

Изменения, внесенные в рабочий проект C ++ 20 в июле 2017 г. (Торонто), включают:

  • концепции (то, что вошло в стандарт, - это урезанная версия; также называется "Concepts Lite")
  • назначенные инициализаторы
  • [=, this] как лямбда-захват
  • списки параметров шаблона на лямбдах
  • std::make_sharedи std::allocate_sharedдля массивов

Изменения, внесенные в рабочий проект C ++ 20 на осеннем собрании в ноябре 2017 г. (Альбукерке), включают:

  • трехстороннее сравнение с использованием "оператора космического корабля",operator <=>
  • Инициализация дополнительной переменной в пределах диапазона на основе forзаявления
  • лямбды в неоцененных контекстах
  • конструктивные и назначаемые лямбды без сохранения состояния по умолчанию
  • разрешить расширение пакетов в лямбда- инициализации-захвате
  • строковые литералы как параметры шаблона
  • атомарные интеллектуальные указатели (например, std::atomic<shared_ptr<T>>и std::atomic<weak_ptr<T>>)
  • std::to_address преобразовать указатель в необработанный указатель

Изменения, внесенные в рабочий проект C ++ 20 в марте 2018 г. (Джексонвилл), включают:

  • устранение необходимости typenameв определенных обстоятельствах
  • новые стандартные атрибуты [[no_unique_address]], [[likely]]и[[unlikely]]
  • добавление календаря и часового пояса к <chrono>
  • std::span, обеспечивая представление непрерывного массива (аналогично, std::string_viewно spanможет изменять указанную последовательность)
  • <version> заголовок

Изменения, внесенные в рабочий проект C ++ 20 на летнем собрании в июне 2018 г. (Рапперсвиль), включают:

  • контракты ( позже перенесенные на более поздний стандарт )
  • макросы тестирования функций
  • побитовое преобразование представлений объектов с меньшей детализацией memcpy()и большей способностью использовать внутренние компоненты компилятора
  • условный explicit, позволяющий явному модификатору зависеть от логического выражения
  • виртуальные функции constexpr

Изменения, внесенные в рабочий проект C ++ 20 на осеннем собрании в ноябре 2018 г. (Сан-Диего), включают:

  • диапазоны (Предложение One Ranges)
  • концептуальный краткий синтаксис
  • constexpr union, try and catch, dynamic_cast, typeid и std :: pointer_traits.
  • различные биты библиотеки constexpr
  • немедленные функции с использованием constevalключевого слова new
  • целые числа со знаком теперь определены для представления с использованием двух дополнений (переполнение целого числа со знаком остается неопределенным поведением )
  • доработки механизма контрактов (контроль доступа в условиях контракта) (см. список функций, перенесенных на более поздний стандарт )
  • пересмотренная модель памяти
  • создание умного указателя с инициализацией по умолчанию

Изменения, внесенные в рабочий проект C ++ 20 на зимнем собрании в феврале 2019 г. (Kona), включают:

  • сопрограммы
  • модули
  • различные улучшения структурированных привязок (взаимодействие с лямбда-захватами, продолжительность хранения static и thread_local)

Изменения, внесенные в рабочий проект C ++ 20 на летнем собрании в июле 2019 г. (Кельн), включают:

  • контракты были удалены (см. список функций, отложенных до более позднего стандарта )
  • использование оператора запятой в выражениях нижнего индекса устарело
  • дополнения constexpr (тривиальная инициализация по умолчанию, неоцененная встроенная сборка)
  • с использованием перечислений с областью видимости
  • различные изменения в операторе космического корабля
  • DR: небольшие изменения в модулях
  • constinit ключевое слово
  • изменения в концепциях (удаление требований типа -> Typeвозврата)
  • (большая часть) volatileустарела
  • DR: [[nodiscard]]влияние на конструкторов
  • Новые концепции стандартной библиотеки не будут использовать PascalCase (скорее, standard_case, как остальная часть стандартной библиотеки)
  • форматирование текста (интеграция хронографа, исправления углов)
  • битовые операции
  • constexpr INVOKE
  • математические константы
  • добавки согласованности к атомике ( std::atomic_ref<T>, std::atomic<std::shared_ptr<T>>)
  • добавить <=>оператор в стандартную библиотеку
  • заголовочные блоки для стандартной библиотеки
  • средства синхронизации (объединены из: Эффективное атомарное ожидание и семафоры, защелки и барьеры, Улучшение atomic_flag, Не делайте C ++ нереализуемым на малых ЦП)
  • std::source_location
  • контейнеры constexpr ( std::string, std::vector)
  • std::stop_tokenи присоединение к потоку ( std::jthread)

Изменения, внесенные во время резолюции по комментариям Национального банка на осеннем собрании в ноябре 2019 года (Белфаст), включают:

  • Типы классов в параметрах шаблона, не относящегося к типу (NTTP): ограничение отсутствия определяемых пользователем operator==разрешений было удалено, поскольку значение равенства аргументов шаблона было отделено от него operator==. Это также позволяет использовать элементы массива в NTTP типа класса.
  • Типы с плавающей запятой, указатели и ссылки, объединения и классы, подобные объединениям (типы классов, содержащие анонимные объединения), теперь разрешены как NTTP.
  • Идентификатор функции теперь также включает завершающие требования-предложения (P1971)
  • Удалены ограниченные нешаблонные функции.
  • <compare> теперь доступен в автономных реализациях
  • std::spans typedef был изменен с index_typeна, size_typeчтобы соответствовать остальной части стандартной библиотеки
  • Черты концептов были переименованы в соответствии с переименованием концепций в результате встречи в Кельне.
  • Несколько исправлений и дополнений к диапазонам (P1456R1: представления только для перемещения, P1391R4: конструктор диапазона для std::string_view(конструктор из пары символов итератора), P1394R4: конструктор диапазона для std::span<ref>, P1870R1: диапазон пересылки <T> слишком тонкий)
  • Инициализация для std::atomic<T>была изменена, чтобы она работала с инициализацией по умолчанию и списком, std::latchи std::barrierтеперь может сообщать о максимальном количестве потоков, поддерживаемых реализацией, через новую функцию-член.max()
  • std::weak_equalityи std::strong_equalityбыли удалены, так как больше не используются
  • Алгоритмы в <numeric>были сделаныconstexpr
  • Добавлены отсутствующие макросы проверки функций для новых или измененных функций C ++ 20.

использованная литература

внешние ссылки