C ++ 20

редактировать
Версия 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ключевое слово
  • изменения концепций (удаление ->Typereturn-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 :: spans 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, автор: Эрик Ниблер
Последняя правка сделана 2021-05-13 08:52:45
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте