Версия 2020 стандарта языка программирования C ++
C ++ 20 - это имя версии стандарта ISO / IEC для программы C ++. g язык, следующий за C ++ 17. Техническая доработка стандарта была завершена рабочей группой WG21 на встрече в Праге в феврале 2020 года. C ++ 20 в настоящее время находится на окончательной редакционной работе после того, как проект был утвержден 4 сентября 2020 года.
C ++ 20 добавляет новые элементы. основные функции, чем C ++ 14 или C ++ 17. Ниже приведен частичный список изменений, которые были приняты или обсуждались для включения в C ++ 20.
Содержание
- 1 Новые функции
- 1.1 Язык
- 1.2 Библиотека
- 1.3 Устарело
- 1.4 Новые (и измененные) ключевые слова
- 2 История изменений
- 3 Функции, опубликованные в виде технических спецификаций
- 4 Функции, относящиеся к более позднему стандарту
- 5 Поддержка компилятора
- 6 См. Также
- 7 Ссылки
- 8 Внешние ссылки
Новые возможности
В C ++ 20 появилось много новых функций. Следующие ниже списки могут быть неполными.
Язык
- концепции с кратким синтаксисом
- модули
- назначенные инициализаторы (на основе функции C99 и общие G ++ extension)
[=, this]
как лямбда-захват- списки параметров шаблона для лямбда-выражений
- трехстороннее сравнение с использованием «оператора космического корабля»,
operator <=>
- инициализация дополнительной переменной в пределах диапазона
для
выражения - лямбда-выражений в неоцененных контекстах
- конструктивные и назначаемые по умолчанию лямбда-выражения без состояния
- разрешить расширение пакетов в лямбда-инициализации-захвате
- строковых литералов в качестве параметров шаблона
- устраняя необходимость в
typename
в определенных обстоятельствах - новый стандарт атрибуты
[[no_unique_address]]
, [[вероятно]]
и [[маловероятно]]
- условное
явное
, позволяющее явному модификатору зависеть от логического выражения - расширенного
constexpr
: виртуальные функции, union, try and catch, dynamic_cast и typeid, std :: pointer_tra его - непосредственные функции, использующие новое ключевое слово
consteval
- целые числа со знаком, теперь определены для представления с использованием дополнения до двух (переполнение целого числа со знаком остается неопределенное поведение )
- пересмотренная модель памяти
- различные улучшения структурированных привязок (взаимодействие с лямбда-захватами, продолжительность хранения статического и thread_local)
- сопрограммы
с использованием
в перечислениях с ограниченной областью действияconstinit
ключевое слово
Библиотека
- диапазонов (Предложение One Ranges)
std :: make_shared
и std :: allocate_shared
для массивов- атомарного интеллектуального указатели (такие как
std :: atomic >
и std :: atomic >
) std :: to_address
для преобразования указателя на необработанный указатель- calendar и time- добавление зоны к
std :: span
, обеспечивающее представление непрерывного массива (аналогично std :: string_view
, но span
может изменять указанную последовательность)
заголовокstd :: bit_cast <>
для преобразования типов представлений объектов с меньшей степенью детализации, чем memcp y ()
и другие возможности использования внутренних компонентов компилятора- макросы тестирования функций
- различные биты библиотеки constexpr
- создание интеллектуального указателя с инициализацией по умолчанию
std :: map :: содержит
метод- битовые операции, такие как начальные / конечные ноль / один счет и операции log2
std :: bind_front
Устарело
- Использование оператора запятой в нижнем индексе выражения устарели
- (большая часть)
энергозависимые
устарели
Новые (и измененные) ключевые слова
Добавлено много новых ключевых слов ( и новый «оператор космического корабля», оператор <=>
), например concept
, constinit
, consteval
, co_await
, co_return
, co_yield
, требует
(плюс измененное значение для export
) и char8_t
. А явный
может принимать выражение начиная с C ++ 20. Большинство случаев использования ключевого слова volatile
устарело.
Помимо ключевых слов, существуют идентификаторы со специальным значением, включая новый import
и модуль
.
Новые атрибуты в C ++ 20: [[вероятно]]
, [[маловероятно]]
и [[no_unique_address]]
История изменений
Изменения, примененные к рабочему проекту C ++ 20 в июле 2017 г. (Торонто), включают:
- концепции
- назначенные инициализаторы
[=, this]
как лямбда-захват- списки параметров шаблона для лямбда-выражений
std :: make_shared
и std :: allocate_shared
для массивов
Изменения, примененные к работе C ++ 20 черновик осеннего собрания в ноябре 2017 г. (Альбукерке) включает:
- трехстороннее сравнение с использованием «оператора космического корабля»,
оператор <=>
- инициализацию дополнительной переменной в пределах диапазона
for
оператор - лямбда-выражения в неоцененных контекстах
- конструктивные и назначаемые лямбда-выражения без сохранения состояния по умолчанию
- разрешают расширение пакетов в лямбда-выражениях init-capture
- строковые литералы как параметры шаблона
- атомарные интеллектуальные указатели (например,
std :: atomic >
и std :: atomic >
) std :: to_address
для преобразования указателя в необработанный указатель
Изменения, внесенные в рабочий проект C ++ 20 в марте 2018 г. (Джексонвилл), включают:
- устранение необходимости в
typename
в определенных обстоятельствах - новые стандартные атрибуты
[[no_unique_address]]
, [[вероятно]]
и [[маловероятно]]
- добавление календаря и часового пояса в
std :: span
, обеспечивая представление непрерывного массива (аналогично std :: string_view
, но span
может изменять указанную последовательность)
заголовок
Изменения, внесенные в рабочий проект C ++ 20 на летнем собрании в июне 2018 г. (Рапперсвиль), включают:
контракты(позже перенесены на более поздний стандартный макрос)- тестирования функций
- побитовое приведение представлений объектов с меньшей детализацией, чем
memcpy ()
, и большей способностью использовать внутренние компоненты компилятора - условное
явное t
, позволяя явному модификатору быть зависимым от логического выражения - виртуальные функции constexpr
Изменения, примененные к рабочему проекту C ++ 20 на осенней встрече в ноябре 2018 г. (Сан-Диего) включают:
- диапазоны (Предложение One Ranges)
- краткий синтаксис концепции
- constexpr union, try and catch, dynamic_cast, typeid и std :: pointer_traits.
- различные биты библиотеки constexpr
- немедленные функции, использующие новое ключевое слово
consteval
- целые числа со знаком, теперь определены для представления с использованием дополнения до двух (знаковое целочисленное переполнение остается неопределенным поведением )
уточнениями функции контрактов (контроль доступа в условиях контракта)(см. список функций, отложенных до более позднего стандарта)- измененная модель памяти
- Создание интеллектуального указателя с инициализацией по умолчанию
Изменения, примененные к рабочему проекту C ++ 20 на зимней встрече в феврале 2019 г. (Kona), включают:
- сопрограммы
- модули
- различные улучшения структурированных привязок (взаимодействие с лямбда-захватами, статическая продолжительность хранения и время хранения thread_local)
Изменения, внесенные в рабочий проект C ++ 20 на летнем собрании в июле 2019 года (Кельн), включают:
- контракты были удалены (см. список функций, отложенных до более позднего стандарта)
- использование оператора запятой в выражениях нижнего индекса устарело
- добавления constexpr (тривиальная инициализация по умолчанию, неоцененная встроенная сборка)
- с использованием перечислений с ограниченной областью действия
- различные изменения оператора космического корабля
- DR: незначительные изменения в модулях
constinit
ключевое слово- изменения концепций (удаление
->Type
return-type-requirements) - (большая часть)
непостоянный
устарел - DR:
[[nodiscard]]
эффекты на конструкторы - Новые концепции стандартной библиотеки не будут использовать PascalCase (скорее, standard_case, как остальная часть стандартной библиотеки)
- форматирование текста (интеграция хронографа, исправления углового регистра)
- bi t операции
constexpr INVOKE
- математические константы
- добавление согласованности к атомике (
std :: atomic_ref
,std :: atomic >
) - добавляет оператор
<=>
в стандартную библиотеку - блоки заголовков для стандартной библиотеки
- средства синхронизации (объединены из: Эффективное атомарное ожидание и семафоры, защелки и барьеры, Улучшение atomic_flag, Не делайте C ++ нереализуемым на малых ЦП)
std :: source_location
- контейнеры constexpr (
std :: string
, std :: vector
) std :: stop_token
и присоединение к потоку (std :: jthread
)
Изменения, внесенные во время разрешения комментариев NB на осеннем собрании в ноябре 2019 г. (Белфаст), включают:
- Типы классов в параметрах шаблона, не являющегося типом (NTTP): ограничение не определяется пользователем
operator ==
allowed был удален, поскольку значение равенства аргументов шаблона было отделено от operator ==
. Это также позволяет использовать элементы массива в NTTP типа класса. - Типы с плавающей запятой, указатели, ссылки, объединения и классы, подобные объединению (типы классов, содержащие анонимные объединения), теперь разрешены как NTTP.
- Идентификатор функции теперь также включает завершающие предложения-требования (P1971)
- Ограниченные нешаблонные функции удалены
теперь доступны в автономных реализацияхstd :: span
s typedef был изменен с index_type
на size_type
, чтобы соответствовать остальной части стандартной библиотеки- Концептуальные черты были переименованы в соответствии с переименованием концепции в результате встречи в Кельне
- Несколько исправлений и дополнений к диапазонам (P1456R1: представления только для перемещения, P1391R4: конструктор диапазона для
std :: string_view
(конструктор из пары итераторов из символов), P1394R4: конструктор диапазона для std::span
, P1870R1: диапазон пересылки слишком тонкий) - Инициализация для
std :: atomic
изменено на заставить его работать с инициализацией по умолчанию и списком, std :: latch
и std :: барьер
теперь могут сообщать о максимальном количестве потоков, поддерживаемых реализацией через новую функцию-член max ()
std :: weak_equality
и std :: strong_equality
были удалены, поскольку они больше не используются- Алгоритмы в
созданы constexpr
- Добавлены отсутствующие макросы тестирования функций для новых или измененных функций C ++ 20
Функции, опубликованные в виде технических спецификаций
- Parallelism TS v2 (включая блоки задач)
- Networking TS v1
- Reflection TS v1
Функции, отнесенные к более позднему стандарту
- Контракты - была сформирована новая исследовательская группа (ИК21) для работы над новым предложением
- Reflection
- Метаклассы
- Исполнители
- Сетевые расширения, включая асинхронные, базовые службы ввода-вывода, таймеры, буферы и ориентированные на буфер потоки, сокеты и Интернет-протоколы (заблокированные исполнителями)
- Свойства
- Расширенные фьючерсы
Компилятор support
Разработчики основных компиляторов подготовили окончательный стандарт C ++ 20, реализовав экспериментальную поддержку различных функций из черновиков C ++ 20.
- 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
. Параметр / std: c ++ 20
для включения режима C ++ 20 ожидается, как только компилятор завершит выполнение функции C ++ 20.
См. Также
Ссылки
Внешние ссылки
- JTC1 / SC22 / WG21 - Рабочая группа по стандарту ISO / IEC C ++ (также известная как Комитет по стандартам C ++)
- Ranges (range-v3 ) репозиторий github, автор: Эрик Ниблер