C++20
Текущая ревизия стандарта C++
Новые возможности языка
- Макросы тестирования возможностей
- Оператор трёхстороннего сравнения
<=>иoperator==() = default - Инициализация по полям
- Инструкции инициализации и инициализаторы в циклах foreach —
-
char8_t - Новые атрибуты:
[[no_unique_address]],[[likely]],[[unlikely]] -
Pack-expansionsв захвате лямбда-выражений - Убрано требование использования
typenameдля разбора типов во многих контекстах -
consteval,constinit - Дальнейшее ослабление constexpr
- Целочисленные типы со знаком используют дополнительный код
- Битовые операторы сдвига — унифицировано поведение
- Инициализация агрегатов с использованием скобок
- Корутины
- Модули
- Ограничения и концепты
- Сокращённый шаблон функции
- DR11: Оператор new для массивов может выводить размер массива
Новые возможности библиотеки
Новые заголовочные файлы
-
<bit> -
<compare> -
<concepts> -
<coroutine> -
<format> -
<numbers> -
<ranges> -
<source_location> -
<span> -
<syncstream> -
<version>
в библиотеке поддержки потоков Thread support library:
Возможности библиотеки
- Макросы тестирования возможностей библиотеки
- Библиотека форматирования
- Библиотека концептов
- Календарь и временная зона в
<chrono> -
std::source_location -
std::span -
std::endian:big/little/native - Целочисленные операции с степенями двойки и
std::bit_castв<bit> - Поддержка массивов для
std::make_shared -
std::remove_cvref -
std::to_address - Атомные типы с плавающей точкой,
std::atomicатомные типы - Классы для координации потоков:
std::barrier,std::latchиstd::counting_semaphore -
std::jthreadи классы для отмены потока:std::stop_token,std::stop_sourceиstd::stop_callback -
std::basic_osyncstream -
std::basic_stringи другие использованияchar8_t -
constexprдля<algorithm>,<utility>,<complex> -
string::starts_with/ends_withиstring_view::starts_with/ends_with -
std::assume_aligned -
std::bind_front -
std::c8rtomb/std::mbrtoc8 -
std::make_obj_using_allocatorи т.д. -
std::make_shared/std::make_unique - Гетерогенный поиск в неупорядоченных ассоциативных контейнерах
-
std::pmr::polymorphic_allocatorс дополнительными членами-функциями иstd::byteв качестве аргумента шаблона по умолчанию -
execution::unseq -
std::midpointиstd::lerp -
std::size -
std::is_bounded_array,std::is_unbounded_array - Диапазоны
- Единообразное удаление элементов контейнеров:
std::erase/std::erase_if, например,std::erase(std::list)илиerase_if(std::map)и т.д. - Математические константы в
<numbers>
Отчёты об ошибках
| Отчёты об ошибках, исправленные в C++20 (158 основных, 345 библиотечных) |
|---|
Поддержка компилятора
Основная статья: Поддержка компилятора C++20
Основные языковые возможности C++20
| Функция C++20 | Статья(и) | GCC | Clang | MSVC | Apple Clang | EDG eccp | Intel C++ | IBM XL C++ | IBM Open XL C++ для AIX | IBM Open XL C++ для z/OS | Sun/Oracle C++ | Embarcadero C++ Builder | Cray | Nvidia HPC C++ (ex PGI)* | Nvidia nvcc | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Разрешение захвата лямбда-функций [=, this] | P0409R2 | 8 | 6 | 19.22* | 10.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
__VA_OPT__ | P0306R4 P1042R1 |
8 (частично)* 10 (частично)* 12 | 9 | 19.25* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
| Инициализация с указанием элементов | P0329R4 |
4.7 (частично)* 8 |
3.0 (частично)* 10 | 19.21* | 12.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
| Список параметров шаблона для универсальных лямбда-функций | P0428R2 | 8 | 9 | 19.22* | 11.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
| По умолчанию инициализаторы членов для битовых полей | P0683R1 | 8 | 6 | 19.25* | 10.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
| Конструкторы со списком инициализаторов в выводе аргументов шаблона класса | P0702R1 | 8 | 6 | 19.14* | Yes | 5.0 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
const&-квалифицированные указатели на члены | P0704R1 | 8 | 6 | 19.0 (2015)* | 10.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
| Концепции | P0734R0 | 6 (Только TS) 10 | 10 |
19.23* (частично)* 19.30* | 12.0.0* (частично) | 6.1 | Поддерживалось в 2021.6, удалено в 2021.7 | 11.0 | 20.11 | 12.0 | ||||||
| Лямбда-функции в невычисляемых контекстах | P0315R4 | 9 |
13 (частично)* 14 (частично)* 17 | 19.28 (16.8)* | 13.1.6* (частично) | 6.2 | 12.0 | |||||||||
| Оператор трехстороннего сравнения | P0515R3 | 10 | 8 (частично) 10 | 19.20* | 12.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | ||||||
| DR: Упрощение неявного захвата лямбда-функций | P0588R1 | 8 | 19.24* | 5.1 | 2021.1 | 20.7 | 12.0 | |||||||||
| Инициализирующие операторы для цикла range-based for | P0614R1 | 9 | 8 | 19.25* | 11.0.0* | 6.0 | 2021.7 | 11.0 | 20.11 | 12.0 | ||||||
| Бессостоятельные лямбда-функции, поддерживающие конструктор по умолчанию и присваивание | P0624R2 | 9 | 8 | 19.22* | 10.0.1* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 |
const несовпадение с конструктором по умолчанию | P0641R2 | 9 | 8 | 19.0 (2015)* | 10.0.1* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Проверка доступа к специализациям | P0692R1 | Да | 8 (частично) 14 | 19.26* | 14.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | ||||||
| ADL и шаблоны функций, которые не видны | P0846R0 | 9 | 9 | 19.21* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
DR11: Указать, когда constexpr определения функций необходимы для вычисления констант | P0859R0 |
5.2 (частично)* 9 | 8 |
19.27* (частично)* 19.31* | 11.0.0* | 11.0 | 12.0 | ||||||||
Атрибуты [[likely]] и [[unlikely]] | P0479R5 | 9 | 12 | 19.26* | 13.0.0* | 5.1 | 2021.7 | 20.7 | 12.0 | ||||||
Сделать typename более необязательным | P0634R3 | 9 | 16 | 19.29 (16.10)* | 5.1 | 20.7 | 12.0 | ||||||||
Pack-expansions в захвате лямбда-выражений | P0780R2 | 9 | 9 | 19.22* | 11.0.3* | 6.1 | 2021.7 | 11.0 | 20.11 | 12.0 | |||||
Атрибут [[no_unique_address]] | P0840R2 | 9 | 9 | 19.28 (16.9)** | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Условные тривиальные специальные члены функций | P0848R3 | 10 | 16 | 19.28 (16.8)* | 6.1 | 2021.7 | 20.11 | 12.0 | |||||||
| DR11: Смягчение правил поиска точек кастомизации для связывания по структуре | P0961R1 | 8 | 8 | 19.21* | 10.0.1* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| DR11: Смягчение правил поиска точек кастомизации для цикла range-for | P0962R1 | 8 | 8 | 19.25* | 11.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| DR17: Разрешить связывание по структуре для доступных членов | P0969R0 | 8 | 8 | 19.21* | 10.0.1* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
Удаление operator delete | P0722R3 | 9 | 6 | 19.27* | 10.0.0* | 6.1 | 11.0 | 20.11 | 12.0 | ||||||
| Типы классов в параметрах шаблонов, не являющихся типами | P0732R2 | 9 | 12 (частично) |
19.26*(частично)* 19.28 (16.9)* | 13.0.0* (частично) | 6.2 | 12.0 |
Отменить неявный захват this с помощью [=] | P0806R2 | 9 | 7 | 19.22* | 10.0.1* | 5.1 | 11.0 | 20.7 | 12.0 | ||||||
explicit(bool) | P0892R2 | 9 | 9 | 19.24* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Интеграция макросов проверки функций | P0941R2 | 5 | 3.4 |
19.15* (частично) 19.20* | Да | 5.0 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Запрет агрегатов с пользовательскими конструкторами | P1008R1 | 9 | 8 | 19.20* | 10.0.1* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
constexpr виртуальная функция | P1064R0 | 9 | 9 | 19.28 (16.9)* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Улучшения согласованности для сравнений | P1120R0 | 10 | 8 (частично) 10 | 19.22* | 12.0.0* | 5.1 | 11.0 | 20.7 | 12.0 | ||||||
char8_t | P0482R6 | 9 | 7* | 19.22* | 10.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
std::is_constant_evaluated() | P0595R2 | 9 | 9 | 19.25* | 11.0.3* | 5.1 | 19.1 | 11.0 | 12.0 | ||||||
constexpr try-catch блоки | P1002R1 | 9 | 8 | 19.25* | 10.0.1* | 5.1 | 11.0 | 20.7 | 12.0 | ||||||
Немедленные функции (consteval) | P1073R3 |
10 (частично)* 11 | 11 (частично) 14 (частично)* 17 |
19.28 (16.8)* (частично)* 19.29 (16.10)* | 11.0.3* (частично) | 5.1 | 2021.1 | 20.7 | 12.0 | ||||||
| Вложенные inline-пространства имен | P1094R2 | 9 | 8 | 19.27* | 10.0.1* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Ещё один подход для ограниченных объявлений | P1141R2 | 10 | 10 |
19.26* (частично) 19.28 (16.9)* | 12.0.5* | 6.1 | 11.0 | 20.11 | 12.0 | ||||||
| Знаковые целые числа — это дополнительный код | P1236R1 | 9 | 9 | Да | 11.0.3* | Н/Д | Н/Д | 11.0 | да* | 12.0 | |||||
dynamic_cast и полиморфное typeid в постоянных выражениях | P1327R1 | 10 | 9 | 19.29 (16.10)* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 |
Изменение активного члена объединения внутри constexpr | P1330R0 | 9 | 9 | 19.10* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Корутины | P0912R5 | 10 | 8 (частично) 17 (частично)* |
19.0 (2015)* (частично) 19.10* (только TS) 19.28 (16.8)* | 10.0.1* (частично) | 5.1 | 2021.1 | 12.0 (только код хоста) | |||||||
| Скобочные инициализация агрегатов | P0960R3 | 10 | 16 | 19.28 (16.8)* | 5.1 | 2021.1 | 20.7 | 12.0 | |||||||
DR11: Вывод размера массива в new-выражениях | P1009R2 | 11 | 9 | 19.27* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Модули | P1103R3 | 11 (частично) | 8 (частично) |
19.0 (2015)* (частично) 19.10* (только TS) 19.28 (16.8)* | 10.0.1* (частично) | ||||||||||
| Более строгие требования к Unicode | P1041R4 P1139R2 | 10 | Да |
19.0 (2015)* (P1041R4) 19.26* (P1139R2) | Да | Н/Д | 11.0 | 12.0 | |||||||
<=> != == | P1185R2 | 10 | 10 | 19.22* | 12.0.0* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| DR: Явно заданные функции с различными спецификациями исключений | P1286R2 | 10 | 9 | 19.28 (16.8)* | 11.0.3* | 5.1 | 2021.1 | 11.0 | 20.7 | 12.0 | |||||
| Захват лямбда-выражений и спецификаторы класса хранения структурированных связываний | P1091R3 P1381R1 | 10 | 8 (частично) 16 |
19.11*(P1381R1) 19.24*(P1091R3) | 10.0.1* (частично) | 5.1 | 2021.1 | 20.7 | 12.0 | ||||||
| Разрешить преобразования в массивы с неизвестной границей | P0388R4 | 10 | 14 | 19.27* | 14.0.0* | 6.0 | 2021.5 | 20.11 | 12.0 | ||||||
constexpr операции над контейнерами | P0784R7 | 10 | 10 | 19.28 (16.9)* | 12.0.0* | 6.0 | 2021.5 | 11.0 | 20.11 | 12.0 | |||||
Устаревание некоторых применений volatile | P1152R4 | 10 | 10 | 19.27* | 12.0.0* | 6.0 | 2021.5 | 11.0 | 20.11 | 12.0 | |||||
constinit | P1143R2 | 10 | 10 | 19.29 (16.10)* | 12.0.0* | 6.1 | 2021.7 | 11.0 | 20.11 | 12.0 | |||||
| Устаревать оператор запятой в индексации | P1161R3 | 10 | 9 | 19.25* | 11.0.3* | 6.0 | 2021.7 | 11.0 | 20.11 | 12.0 |
[[nodiscard]] с сообщением | P1301R4 | 10 | 9 | 19.25* | 11.0.3* | 6.0 | 2021.5 | 11.0 | 20.11 | 12.0 | |||||
Тривиальная инициализация по умолчанию в constexpr функциях | P1331R2 | 10 | 10 | 19.27* | 12.0.0* | 6.1 | 2021.7 | 11.0 | 20.11 | 12.0 | |||||
Неоцениваемое asm-объявление в constexpr функциях | P1668R1 | 10 | 10 | 19.28 (16.9)* | 12.0.0* | 6.1 | 2021.7 | 11.0 | 20.11 | 12.0 | |||||
using enum | P1099R5 | 11 | 13 | 19.24* | 13.1.6* | 6.3 | 12.0 | ||||||||
| Синтезирование трёхстороннего сравнения для указанной категории сравнения | P1186R3 | 11 | 10 | 19.24* | 12.0.0* | 6.0 | 2021.5 | 11.0 | 20.11 | 12.0 | |||||
DR17: [[nodiscard]] для конструкторов | P1771R1 | 10 | 9 | 19.24* | 11.0.3* | 6.0 | 2021.5 | 11.0 | 20.11 | 12.0 | |||||
| Вывод типов шаблонов классов для шаблонов псевдонимов | P1814R0 | 10 | 19.27* | 6.5 | 12.0 | ||||||||||
| Вывод типов шаблонов классов для агрегатов | P1816R0 P2082R1 | 10(P1816R0) 11(P2082R1) | 17 | 19.27* | 6.3 | 12.0 | |||||||||
| DR: Неявное перемещение для более локальных объектов и ссылок на значения, являющиеся правыми операндами | P1825R0 | 11* | 13 | 19.24* | 13.1.6* | 6.0 | 2021.5 | 20.11 | 12.0 | ||||||
| Разрешить сравнение по умолчанию по значению | P1946R0 | 10 | 10 | 19.25* | 12.0.0* | 6.1 | 2021.7 | 11.0 | 20.11 | 12.0 | |||||
Удалить std::weak_equality и std::strong_equality | P1959R0 | 10 | 10 | 19.25* | 12.0.0* | 6.1 | 2021.7 | 11.0 | 20.11 | 12.0 | |||||
| Несоответствия с параметрами шаблонов, не являющимися типами | P1907R1 | 10 (частично) 11 | 12 (частично) | 19.26* | 13.1.6* (частично) | 6.2 | 12.0 | ||||||||
| DR98: Псевдодеструкторы завершают жизненный цикл объекта | P0593R6 | 11 | 11 | Да | 12.0.5* | Не применимо | Не применимо | 11.0 | 12.0 | ||||||
DR11: Преобразование из T* в bool должно рассматриваться как сужение | P1957R2 |
10* 11* | 11 | 19.27* | 12.0.5* | 6.1 | 11.0 | 12.0 | |||||||
| Особенности C++20 | Статья(и) | GCC | Clang | MSVC | Apple Clang | EDG eccp | Intel C++ | IBM XL C++ | IBM Open XL C++ for AIX | IBM Open XL C++ for z/OS | Sun/Oracle C++ | Embarcadero C++ Builder | Cray | Nvidia HPC C++ (ex PGI)* | Nvidia nvcc |
|---|
Особенности библиотеки C++20
| Функция C++20 | Статья(и) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
IBM Open XL C/C++ для AIX* |
Sun/Oracle C++* |
Embarcadero C++ Builder* | |
|---|---|---|---|---|---|---|---|---|---|
std::endian | P0463R1 | 8 | 7 | 19.22* | 10.0.0* | ||||
Расширение std::make_shared() для поддержки массивов | P0674R1 | 12 | 15 | 19.27* | 14.0.3* | ||||
| Атомарные типы с плавающей точкой | P0020R6 | 10 | 18 | 19.22* | |||||
Синхронизированный буферизованный ввод/вывод (std::basic_osyncstream) | P0053R7 | 11 | 18 | 19.29 (16.10)* | |||||
constexpr для <algorithm> и <utility> | P0202R3 | 10 | 8 (частично) 12 | 19.26* | 10.0.1* (частично) | ||||
Больше constexpr для <complex> | P0415R1 | 9 | 7 (частично) 16 | 19.27* | 10.0.0* (частично) | ||||
Сделать std::memory_order перечислением со сферой видимости | P0439R0 | 9 | 9 | 19.25* | 11.0.3* | ||||
Проверка префикса и суффикса строки: string(_view) ::starts_with/ends_with | P0457R2 | 9 | 6 | 19.21* | 10.0.0* | ||||
Поддержка библиотеки для operator<=> <compare> | P0768R1 | 10 | 7 (частично) 12 (частично)* 17 |
19.20* (частично) 19.28 (16.9)* | 13.0.0* | ||||
std::remove_cvref | P0550R2 | 9 | 6 | 19.20* | 10.0.0* | ||||
[[nodiscard]] в стандартной библиотеке | P0600R1 | 9 | 7 (частично) 16 |
19.13* (частично) 19.22* | 10.0.0* (частично) | ||||
Использование std::move в числовых алгоритмах | P0616R0 | 9 | 12 | 19.23* | 13.0.0* | ||||
| Утилита для преобразования указателя в сырой указатель | P0653R2 | 8 | 6 | 19.22* | Yes | ||||
Атомарные std::shared_ptr и std::weak_ptr | P0718R2 | 12 | 19.27* | ||||||
std::span | P0122R7 | 10 | 7 | 19.26* | 10.0.0* | ||||
| Календарь и часовой пояс | P0355R7 |
11 (частично)* 13 (частично)* 14 | 7 (частично) | 19.29 (16.10)* | 10.0.0* (частично) | ||||
<version> | P0754R2 | 9 | 7 | 19.22* | 10.0.0* | ||||
| Сравнение неупорядоченных контейнеров | P0809R0 | Да | Да | 16.0* | Да |
| Требования к ConstexprIterator | P0858R0 | 9 | 12 | 19.11* | 13.0.0* | |||
std::basic_string::reserve() не должна уменьшаться | P0966R1 | 11 | 8 | 19.25* | 10.0.1* | |||
| Атомный сравнение и обмен с битами заполнения | P0528R3 | 13 | 19.28 (16.8)* | |||||
std::atomic_ref | P0019R8 | 10 | 19.28 (16.8)* | |||||
contains() член-функция ассоциативных контейнеров, например std::map::contains() | P0458R2 | 9 | 13 | 19.21* | 13.1.6* | |||
| DR11: Гарантированное удаление копирования для поэлементного конструирования | P0475R1 | 9 | Да | 19.29 (16.10)* | Да | |||
std::bit_cast() | P0476R2 | 11 | 14 | 19.27* | 14.0.3* | |||
| Операции над целыми степенями двойки:
| P0556R3 P1956R1 | 9 (P0556R3) 10 (P1956R1) | 9 (P0556R3) 12 (P1956R1) |
19.25* (P0556R3)* 19.27* (P1956R1)* 19.28 (16.8)* | 11.0.3* (P0556R3) | |||
| Улучшение возвращаемого значения алгоритмов типа erase | P0646R1 | 9 | 10 | 19.21* | 12.0.0* | |||
std::destroying_delete | P0722R3 | 9 | 9 | 19.27* | 11.0.3* | |||
std::is_nothrow_convertible | P0758R1 | 9 | 9 | 19.23* | 11.0.3* | |||
Добавить std::shift_left/right в <algorithm> | P0769R2 | 10 | 12 | 19.21* | 13.0.0* | |||
Constexpr для std::swap() и swap связанных функций | P0879R0 | 10 | 13 | 19.26* | 13.1.6* | |||
std::type_identity | P0887R1 | 9 | 8 | 19.21* | 10.0.1* | |||
| Библиотека концептов концепции | P0898R3 | 10 | 13 | 19.23* | 13.1.6* | |||
constexpr операторы сравнения для std::array | P1023R0 | 10 | 8 | 19.27* | 10.0.1* | |||
std::unwrap_ref_decay и std::unwrap_reference | P0318R1 | 9 | 8 | 19.21* | 10.0.1* | |||
std::bind_front() | P0356R5 | 9 | 13 | 19.25* | 13.1.6* | |||
std::reference_wrapper для неполных типов | P0357R3 | 9 | 8 | 19.26* | 10.0.1* | |||
Исправление operator>>(basic_istream&, CharT*) | P0487R1 | 11 | 8 | 19.23* | 10.0.1* |
Поддержка библиотеки для char8_t | P0482R6 | 9 | 8 (частичная) 16 | 19.22* | 10.0.1* (частичная) | |||
| Функции-утилиты для реализации использования аллокатора при инициализации | P0591R4 | 9 | 16 | 19.29 (16.10)* | 15.0.0* | |||
DR17: std::variant и std::optional должны распространять тривиальность копирования/перемещения | P0602R4 | 8.3 | 8 | 19.11* | 10.0.1* | |||
Здравый смысл std::variant преобразующего конструктора | P0608R3 | 10 | 9 | 19.29 (16.10)* | 11.0.3* | |||
Перемещающий конструктор std::function должен быть noexcept | P0771R1 | 7.2 | 6 | 19.22* | Yes | |||
| Предложение по одной диапазонов алгоритму | P0896R4 | 10 | 13 (частичная) 15* | 19.29 (16.10)* | 14.0.3* | |||
| Гетерогенный поиск для неупорядоченных контейнеров | P0919R3 P1690R1 | 11 | 12 |
19.23* (P0919R3) 19.25* (P1690R1) | 13.0.0* | |||
<chrono> zero(), min(), и max() должны быть noexcept | P0972R0 | 9 | 8 | 19.14* | 10.0.1* | |||
constexpr в std::pointer_traits | P1006R1 | 9 | 8 | 19.26* | 10.0.1* | |||
std::assume_aligned() | P1007R3 |
9* 11 | 15 | 19.28 (16.9)* | 14.0.3* | |||
Создание смарт-указателей с инициализацией по умолчанию (например, make_unique_for_overwrite) | P1020R1 P1973R1 | 11 (unique_ptr) 12 (shared_ptr) | 16 | 19.28 (16.9)* | 15.0.0* | |||
Разное constexpr | P1032R1 | 10 | 13 | 19.28 (16.8)* | 13.1.6* | |||
Удаление операторов сравнения для std::span | P1085R2 | 10 | 8 | 19.26* | 10.0.1* | |||
Согласованное распространение аллокаторов с состоянием, например, для operator+(basic_string) | P1165R1 | 10 | 15 | 19.26* | 14.0.3* | |||
Согласованное удаление из контейнеров, например, std::erase(std::vector), или std::erase_if(std::map) | P1209R0 P1115R3 | 9 (P1209R0) 10 (P1115R3) | 8 (P1209R0) 11 (P1115R3) |
19.25* (P1209R0) 19.27* (P1115R3) | 10.0.1* (P1209R0) | |||
| Модули заголовков стандартной библиотеки | P1502R1 | 11 | 19.29 (16.10)* | |||||
polymorphic_allocator<> как тип словаря | P0339R6 | 9 | 16 | 19.28 (16.9)* | 15.0.0* | |||
std::execution::unseq | P1001R2 | 9 | 19.28 (16.8)* | |||||
std::lerp() и std::midpoint() | P0811R3 | 9 | 9 |
19.23* (частичная) 19.28 (16.8)* | 11.0.3* |
Улучшения удобства использования для std::span | P1024R3 | 10 |
9* 14 | 19.26* | 11.0.3* | |||
DR17: Сделать create_directory() интуитивно понятным | P1164R1 | 8.3 | 12 | 19.20* | 13.0.0* | |||
std::ssize() и беззнаковая протяжённость для std::span | P1227R2 | 10 | 9 | 19.25* | 11.0.3* | |||
| Свойства для (не)ограниченных массивов | P1357R1 | 9 | 9 | 19.25* | 11.0.3* | |||
std::to_array() | P0325R4 | 10 | 10 | 19.25* | 12.0.0* | |||
Эффективный доступ к буферу std::basic_stringbuf | P0408R7 | 11 | 17 | 19.29 (16.10)* | ||||
| Свойства совместимости макета и совместимости указателей | P0466R5 | 12 | 19.29 (16.10)** | |||||
Битовые операции: std::
| P0553R4 | 9 | 9 |
19.25** 19.28 (16.8)* | 11.0.3* | |||
| Математические константы | P0631R8 | 10 | 11 | 19.25* | 12.0.5* | |||
| Форматирование текста | P0645R10 | 13 |
14* 17 | 19.29 (16.10)* | ||||
std::stop_token и std::jthread | P0660R10 | 10 |
17 (частично)* 18 (частично)* | 19.28 (16.9)* | ||||
constexpr std::allocator и связанные утилиты | P0784R7 | 10 | 12 | 19.29 (16.10)* | 13.0.0* | |||
constexpr std::string | P0980R1 | 12 | 15 |
19.29 (16.10)* 19.30** | 14.0.3* | |||
constexpr std::vector | P1004R2 | 12 | 15 |
19.29 (16.10)* 19.30** | 14.0.3* | |||
| Адаптеры диапазонов для ввода | P1035R7 | 10 | 16 | 19.29 (16.10)* | 15.0.0* | |||
constexpr std::invoke() и связанные утилиты | P1065R2 | 10 | 12 | 19.28 (16.8)* | 13.0.0* | |||
Атомное ожидание и уведомление, std::counting_semaphore, std::latch и std::barrier | P1135R6 | 11 | 11 | 19.28 (16.8)* | 13.1.6* | |||
std::source_location | P1208R6 | 11 |
15* (частично) 16 | 19.29 (16.10)* | 15.0.0* |
Добавление <=> в стандартную библиотеку | P1614R2 | 10 |
14* (частично) | 19.29 (16.10)* | 13.1.6* (частично) | |||
constexpr конструктор по умолчанию для std::atomic и std::atomic_flag | P0883R2 | 10 | 13 | 19.26* | 13.1.6* | |||
constexpr для числовых алгоритмов | P1645R1 | 10 | 12 | 19.26* | 13.0.0* | |||
| Безопасные целочисленные сравнения | P0586R2 | 10 | 13 | 19.27* | 13.1.6* | |||
| Функция C++20 | Статья(и) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
IBM Open XL C/C++ для AIX* |
Sun/Oracle C++* |
Embarcadero C++ Builder* |
|---|
* - наведите указатель мыши на ячейку с звездочкой, чтобы увидеть дополнительные всплывающие заметки.
DRnn - число nn после "DR" обозначает целевую ревизию C++, например, DR20 → C++20.
Внешние ссылки
| Примеры работы с C++20 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/20