С ++ 20 - C++20
Изменения языка C ++ |
---|
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::span
s 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.
использованная литература
внешние ссылки
- Ссылка для покупки ISO / IEC 14882: 2020 в интернет-магазине ISO.
- N4860 , последняя черновая версия стандарта.
- JTC1 / SC22 / WG21 - рабочая группа ISO / IEC по стандартам C ++ (также известная как Комитет по стандартам C ++)
- Диапазоны ( диапазон-v3 ) репозиторий GitHub, автор Эрик Ниблер