C++20
C++20 — крупная версия, следующая за C++17. Она включает важные возможности (концепции, модули, сопрограммы и диапазоны), а также другие возможности языка и библиотеки. Стандарт был опубликован в декабре 2020 года.
Новые возможности языка
- Макросы проверки возможностей
-
Оператор трёхстороннего сравнения
<=>иoperator==() = default - Именованные инициализаторы
- Инициализирующие инструкции и инициализаторы в range-
for char8_t- Новые атрибуты:
[[no_unique_address]],[[likely]],[[unlikely]] -
Pack-expansionsв init-захватах лямбда-выражений - Во многих контекстах больше не требуется использовать
typenameдля устранения неоднозначности типов -
consteval,constinit - Дальнейшее смягчение ограничений constexpr
- Целые числа со знаком представлены в дополнительном коде
- Побитовые операторы сдвига имеют единое поведение
- Агрегатная инициализация с использованием круглых скобок
- Сопрограммы
- Модули
- Ограничения и концепции
- Сокращённый шаблон функции
- DR11: new-массив может выводить размер массива
Новые возможности библиотеки
Новые заголовки
<bit><compare><concepts><coroutine><format><numbers><ranges><source_location><span><syncstream><version>
в библиотеке поддержки потоков:
Возможности библиотеки
- Макросы проверки функций библиотеки
- Библиотека форматирования
- Библиотека концептов
-
Библиотека календаря и часовых поясов в
<chrono> std::source_locationstd::span-
std::endian:big/little/native - Операции возведения в целую степень, являющуюся степенью 2, и
std::bit_castв<bit> - Поддержка массивов для
std::make_shared std::remove_cvrefstd::to_address-
Атомарные типы с плавающей точкой, атомарные типы
std::shared_ptr - Классы для координации потоков:
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_alignedstd::bind_front-
std::c8rtomb/std::mbrtoc8 -
std::make_obj_using_allocatorи т. д. -
std::make_shared_for_overwrite/std::make_unique_for_overwrite - Гетерогенный поиск в неупорядоченных ассоциативных контейнерах
-
std::pmr::polymorphic_allocatorс дополнительными функциями-членами иstd::byteв качестве аргумента шаблона по умолчанию execution::unseq-
std::midpointиstd::lerp std::ssize-
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++ |
Nvidia HPC C++ (бывшая PGI)* |
Nvidia nvcc |
Cray | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Разрешён захват лямбда-выражением [=,this] | P0409R2 | 8 | 6 | 19.22* | 10.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 | |
__VA_OPT__ |
P0306R4 P1042R1 |
8 (частично)* 10 (частично)* 12 | 9 | 19.25* | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 | |
| Инициализаторы с указанием полей (FTM)* | P0329R4 |
4.7 (частично)* 8 |
3.0 (частично)* 10 | 19.21* | 12.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 | |
| Список параметров шаблона для обобщённых лямбда-выражений (FTM)* | P0428R2 | 8 | 9 | 19.22* | 11.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 | |
| Инициализаторы нестатических членов для битовых полей | P0683R1 | 8 | 6 | 19.25* | 10.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 | |
| Конструкторы со списком инициализаторов при выводе аргументов шаблона класса | P0702R1 | 8 | 6 | 19.14* | Да | 5.0 | 2021.1 | 20.7 | 12.0 | 11.0 | |
| Указатели на члены с квалификатором const& | P0704R1 | 8 | 6 | 19.0 (2015)* | 10.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 | |
| Концепции (FTM)* | P0734R0 |
5* 10 | 10 |
19.23* (частично)* 19.30* | 12.0.0* (частично) | 6.1 | 2023.1* | 20.11 | 12.0 | 11.0 | |
| Лямбда-выражения в невычисляемых контекстах | P0315R4 | 9 |
13 (частично)* 14 (частично)* 17 | 19.28 (16.8)* | 13.1.6* (частично) | 6.2 | 2023.1 (частично) 2024.0 | 20.7 | 12.0 |
| Оператор трехстороннего сравнения (FTM)* | P0515R3 | 10 | 8 (частично) 10 | 19.20* | 12.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| DR11: упрощение неявного захвата лямбда-выражений | P0588R1 | 8 | 19.24* | 5.1 | 2021.1 | 20.7 | 12.0 | |||
| инициализирующие инструкции в циклах for на основе диапазона | P0614R1 | 9 | 8 | 19.25* | 11.0.0* | 6.0 | 2021.7 | 20.11 | 12.0 | 11.0 |
| Конструируемые по умолчанию и присваиваемые без состояния лямбда-выражения | P0624R2 | 9 | 8 | 19.22* | 10.0.1* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Несоответствие типов функций-членов со специальным статусом, объявленных по умолчанию | P0641R2 | 9 (частично)* | 8 | 19.0 (2015)* (частично)* | 10.0.1* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.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 | 20.7 | 12.0 | 11.0 |
| DR11: указание условий, при которых определения функций constexpr необходимы для вычисления во время компиляции (FTM)* | P0859R0 |
5.2 (частично)* 9 | 8 |
19.27* (частично)* 19.31** | 11.0.0* | (частично) | 12.0 | 11.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)* | 16.0.0* | 5.1 | 2023.1 | 20.7 | 12.0 |
Pack-expansions в инициализирующих захватах лямбда-выражения (FTM)* | P0780R2 | 9 | 9 | 19.22* | 11.0.3* | 6.1 | 2021.7 | 20.11 | 12.0 | 11.0 |
Атрибут [[no_unique_address]] | P0840R2 | 9 | 9 | 19.28 (16.9)** | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Условно тривиальные специальные функции-члены (FTM)* | P0848R3 | 10 | 16 | 19.28 (16.8)* | 6.1 | 2021.7 | 20.11 | 12.0 | ||
| DR17: смягчение правил поиска точки настройки для структурированных привязок | P0961R1 | 8 | 8 | 19.20* | 10.0.1* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| DR11: смягчение правил поиска точки настройки для цикла range-for | P0962R1 | 8 | 8 | 19.25* | 11.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| DR17: разрешение структурированных привязок к доступным членам | P0969R0 | 8 | 8 | 19.20* | 10.0.1* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
Уничтожающий operator delete (FTM)* | P0722R3 | 9 | 6 | 19.27* | 10.0.0* | 6.1 | 2023.1 | 20.11 | 12.0 | 11.0 |
| Типы классов в нетиповых параметрах шаблона | P0732R2 | 9 | 12 (частично) |
19.26*(частично)* 19.28 (16.9)* | 13.0.0* (частично) | 6.2 | 2023.1 (частично) | 21.3 | 12.0 | |
Устаревание неявного захвата this через [=] | P0806R2 | 9 | 7 | 19.22* | 10.0.1* | 5.1 | 20.7 | 12.0 | 11.0 | |
explicit(bool) (FTM)* | P0892R2 | 9 | 9 | 19.24* | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Интеграция макросов проверки возможностей | P0941R2 | 5 | 3.4 |
19.15* (частично) 19.20* | Да | 5.0 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Запрет агрегатов с конструкторами, объявленными пользователем | P1008R1 | 9 | 8 | 19.20* | 10.0.1* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| constexpr виртуальная функция (FTM)* | P1064R0 | 9 | 9 | 19.28 (16.9)* | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Улучшение согласованности для сравнений | P1120R0 | 10 | 8 (частично) 10 | 19.22* | 12.0.0* | 5.1 | 2023.1 | 20.7 | 12.0 | 11.0 |
char8_t (FTM)* | P0482R6 | 9 | 7* | 19.22* | 10.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
std::is_constant_evaluated() (FTM)* | P0595R2 | 9 | 9 | 19.25* | 11.0.3* | 5.1 | 19.1 | 21.1 | 12.0 | 11.0 |
| Блоки constexpr try-catch | P1002R1 | 9 | 8 | 19.25* | 10.0.1* | 5.1 | 2023.1 | 20.7 | 12.0 | 11.0 |
| Немедленно вычисляемые функции (consteval) (FTM)* | P1073R3 |
10 (частично)* 11 | 11 (частично) 14 (частично)* 17 |
19.28 (16.8)* (частично)* 19.29 (16.10)* |
11.0.3* (частично) 15.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | |
| Вложенные встроенные пространства имён | P1094R2 | 9 | 8 | 19.27* | 10.0.1* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Ещё один подход к ограниченным объявлениям | P1141R2 | 10 | 10 |
19.26* (частично) 19.28 (16.9)* | 12.0.5* | 6.1 | 2023.1 | 20.11 | 12.0 | 11.0 |
| Целые числа со знаком представлены в дополнительном коде | P1236R1 | 9 | 9 | Да | 11.0.3* | N/A | 2023.1* | да* | 12.0 | 11.0 |
dynamic_cast и полиморфный typeid в константных выражениях | P1327R1 | 10 | 9 | 19.28 (16.9)* | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Изменение активного члена объединения внутри constexpr (FTM)* | P1330R0 | 9 | 9 | 19.10* | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Сопрограммы (FTM)* (FTM)* |
P0912R5 LWG3393 | 10 | 8 (частично) 17 (частично)* |
19.0 (2015)* (частично) 19.10** 19.28 (16.8)* | 10.0.1* (частично) | 5.1 | 2021.1 | 23.3* | 12.0 (только код хоста) | |
| Инициализация агрегатов в скобках (инициализация агрегатов) (FTM)* | P0960R3 | 10 | 16 | 19.28 (16.8)* | 16.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | |
DR11: Выведение размера массива в выражениях new | P1009R2 | 11 | 9 | 19.27* | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Модули (FTM)* | P1103R3 | 11 (частично) | 8 (частично) |
19.0 (2015)* (частично) 19.10** 19.28 (16.8)* | 10.0.1* (частично) | 2023.1 (частично) | ||||
| Более строгие требования к Unicode |
P1041R4 P1139R2 | 10 | Да |
19.0 (2015)** 19.26** | Да | N/A | 2023.1* | Да | 12.0 | 11.0 |
<=> != == | P1185R2 | 10 | 10 | 19.22* | 12.0.0* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| DR11: Явно заданные функции по умолчанию с разными спецификациями исключений | P1286R2 | 10 | 9 | 19.28 (16.8)* | 11.0.3* | 5.1 | 2021.1 | 20.7 | 12.0 | 11.0 |
| Захват лямбдой и спецификаторы класса хранения структурированных привязок |
P1091R3 P1381R1 | 10 | 8 (частично) 16 |
19.11** 19.24** | 16.0.0* | 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-операции с контейнерами (FTM)* | P0784R7 | 10 | 10 | 19.28 (16.9)* | 12.0.0* | 6.0 | 2021.5 | 20.11 | 12.0 | 11.0 |
Устаревание некоторых применений volatile | P1152R4 | 10 | 10 | 19.27* | 12.0.0* | 6.0 | 2021.5 | 20.11 | 12.0 | 11.0 |
constinit (FTM)* | P1143R2 | 10 | 10 | 19.29 (16.10)* | 12.0.0* | 6.1 | 2021.7 | 20.11 | 12.0 | 11.0 |
| Устаревание оператора запятая в индексах | P1161R3 | 10 | 9 | 19.25* | 11.0.3* | 6.0 | 2021.7 | 20.11 | 12.0 | 11.0 |
[[nodiscard]] с сообщением | P1301R4 | 10 | 9 | 19.25* | 11.0.3* | 6.0 | 2021.5 | 20.11 | 12.0 | 11.0 |
| Тривиальная инициализация по умолчанию в функциях constexpr | P1331R2 | 10 | 10 | 19.27* | 12.0.0* | 6.1 | 2021.7 | 20.11 | 12.0 | 11.0 |
| Неоцениваемое объявление asm в функциях constexpr | P1668R1 | 10 | 10 | 19.28 (16.9)* | 12.0.0* | 6.1 | 2021.7 | 20.11 | 12.0 | 11.0 |
using enum (FTM)* | P1099R5 | 11 | 13 | 19.24* | 13.1.6* | 6.3 | 2023.1 | 22.5 | 12.0 | |
| Синтезирование трёхстороннего сравнения для указанной категории сравнения | P1186R3 | 11 | 10 | 19.24* | 12.0.0* | 6.0 | 2021.5 | 20.11 | 12.0 | 11.0 |
DR17: [[nodiscard]] для конструкторов | P1771R1 | 10 | 9 | 19.24* | 11.0.3* | 6.0 | 2021.5 | 20.11 | 12.0 | 11.0 |
| вывод аргументов шаблона класса для шаблонов-алиасов (FTM)* | P1814R0 | 10 | 19 | 19.27* | 6.5 | 23.9 | 12.0 | |||
| вывод аргументов шаблона класса для агрегатов (FTM)* |
P1816R0 P2082R1 |
10* 11* | 17 | 19.27* | 6.3 |
2023.1 (частично)* 2024.1 | 23.3 | 12.0 | ||
| DR11: Неявное перемещение для большего числа локальных объектов и rvalue-ссылок | 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 | 20.11 | 12.0 | 11.0 |
Удаление std::weak_equality и std::strong_equality | P1959R0 | 10 | 10 | 19.25* | 12.0.0* | 6.1 | 2021.7 | 20.11 | 12.0 | 11.0 |
| Несогласованности с нетиповыми параметрами шаблона (FTM)* | P1907R1 | 10 (частично) 11 | 18 (частично)* | 19.26* | 13.1.6* (частично) | 6.2 | 2023.1 (частично) | 21.3 | 12.0 | |
| DR98: Псевдодеструкторы завершают время жизни объектов | P0593R6 | 11 | 11 | Да | 12.0.5* | Н/Д | 2023.1* | Да | 12.0 | 11.0 |
| DR11: Преобразование из T* в bool следует считать сужающим | P1957R2 |
10* 11* | 11 | 19.27* | 12.0.5* | 6.1 | 12.0 | 11.0 | ||
| Возможность C++20 | Документ(ы) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
Nvidia HPC C++ (ранее PGI)* |
Nvidia nvcc |
Cray |
|---|
Возможности библиотеки C++20
| Возможность C++20 | Документ(ы) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* | |
|---|---|---|---|---|---|---|
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* | 16.0.0* | |
Синхронизированный буферизованный поток (std::basic_osyncstream) (МПВ)* | P0053R7 | 11 | 18 | 19.29 (16.10)* | ||
constexpr для <algorithm> и <utility> (МПВ)* | P0202R3 | 10 | 8 (частично) 12 | 19.26* |
10.0.1* (частично) 13.0.0* |
|
Больше возможностей constexpr для <complex> (МПВ)* | P0415R1 | 9 | 7 (частично) 16 | 19.27* |
10.0.0* (частично) 15.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* (частично) 15.0.0* |
Использование std::move в численных алгоритмах | P0616R0 | 9 | 12 | 19.23* | 13.0.0* |
| Утилита для преобразования указателя в обычный указатель (FTM)* | P0653R2 | 8 | 6 | 19.22* | Да |
Атомарные std::shared_ptr и std::weak_ptr (FTM)* | P0718R2 | 12 | 19.27* | ||
std::span (FTM)* | P0122R7 | 10 | 7 | 19.26* | 10.0.0* |
| Календарь и часовой пояс (FTM)* | P0355R7 |
11 (частично)* 13 (частично)* 14 | 7 (частично) 19 (частично)* | 19.29 (16.10)* | 10.0.0* (частично) |
<version> | P0754R2 | 9 | 7 | 19.22* | 10.0.0* |
| Сравнение неупорядоченных контейнеров | P0809R0 | Да | Да | 16.0* | Да |
| Требования ConstexprIterator (FTM)* (FTM)* | P0858R0 | 9 | 12 | 19.11* | 13.0.0* |
std::basic_string::reserve() не должен уменьшаться | P0966R1 | 11 | 8 | 19.25* | 10.0.1* |
| Атомарная операция compare-and-exchange с битами-заполнителями | P0528R3 | 13 | 19.28 (16.8)* | ||
std::atomic_ref (FTM)* | P0019R8 | 10 | 19 | 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() (FTM)* | P0476R2 | 11 | 14 | 19.27* | 14.0.3* |
|
Операции над целыми степенями 2:
|
P0556R3 P1956R1 |
9* 10* |
9* 12* |
19.25** 19.27** 19.28 (16.8)* |
11.0.3** 13.0.0** |
| Улучшение возвращаемого значения алгоритмов, подобных erase (FTM)* | P0646R1 | 9 | 10 | 19.21* | 12.0.0* |
std::destroying_delete_t (FTM)* | P0722R3 | 9 | 9 | 19.27* | 11.0.3* |
std::is_convertible (FTM)* | P0758R1 | 9 | 9 | 19.23* | 11.0.3* |
Добавление std::shift_left/right в <algorithm> (FTM)* | P0769R2 | 10 | 12 (частично)* | 19.21* | 13.0.0* (частично)* |
Constexpr для функций, связанных с std::swap() и swap | P0879R0 | 10 | 13 | 19.26* | 13.1.6* |
std::type_identity (FTM)* | P0887R1 | 9 | 8 | 19.21* | 10.0.1* |
| Библиотека концептов (FTM)* | 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 (FTM)* | P0318R1 | 9 | 8 | 19.21* | 10.0.1* |
std::bind_front() (FTM)* | 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 (FTM)* | P0482R6 | 9 | 8 (частично) 16 | 19.22* |
10.0.1* (частично) 15.0.0* |
| Вспомогательные функции для реализации конструирования с использованием распределителя памяти | P0591R4 | 9 | 16 | 19.29 (16.10)* | 15.0.0* |
DR17: std::variant и std::optional должны сохранять тривиальность копирования/перемещения | P0602R4 | 8.3 | 8 | 19.11* | 10.0.1* |
DR17: разумный преобразующий конструктор std::variant | P0608R3 | 10 | 9 |
19.29 (16.10)** 19.42** | 11.0.3* |
Конструктор перемещения std::function должен быть noexcept | P0771R1 | 7.2 | 6 | 19.22* | Да |
| Предложение One Ranges (FTM)* | P0896R4 | 10 | 13 (частично) 15* | 19.29 (16.10)* | 14.0.3* |
| Гетерогенный поиск для неупорядоченных ассоциативных контейнеров (FTM)* |
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 (FTM)* | P1006R1 | 9 | 8 | 19.26* | 10.0.1* |
std::assume_aligned() (FTM)* | P1007R3 |
9* 11 | 15 | 19.28 (16.9)* | 14.0.3* |
Создание умных указателей с инициализацией по умолчанию (например, make_unique_for_overwrite) (FTM)* |
P1020R1 P1973R1 |
11* 12* | 16 | 19.28 (16.9)* | 15.0.0* |
| Различные элементы constexpr (FTM)* (FTM)* (FTM)* (FTM)* (FTM)* (FTM)* | 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) (FTM)* |
P1209R0 P1115R3 |
9* 10* |
8* 11* |
19.25** 19.27** |
10.0.1** 12.0.5** |
| Модули заголовков стандартной библиотеки | P1502R1 | 11 | 19.29 (16.10)* | ||
polymorphic_allocator<> в качестве типа-словаря (FTM)* | P0339R6 | 9 | 16 | 19.28 (16.9)* | 15.0.0* |
std::execution::unseq (FTM)* | P1001R2 | 9 | 17 | 19.28 (16.8)* | |
std::lerp() и std::midpoint() (FTM)* | P0811R3 | 9 | 9 |
19.23* (частично) 19.28 (16.8)* | 11.0.3* |
Улучшения удобства использования std::span | P1024R3 | 10 |
9* 14 | 19.26* | 11.0.3* |
DR17: сделать std::create_directory() интуитивно понятным | P1164R1 | 8.3 | 12 | 19.20* | 13.0.0* |
std::ssize() и беззнаковый размер для std::span (FTM)* | P1227R2 | 10 | 9 | 19.25* | 11.0.3* |
| Свойства для (не)ограниченных массивов (не)ограниченных (FTM)* | P1357R1 | 9 | 9 | 19.25* | 11.0.3* |
std::to_array() (FTM)* | P0325R4 | 10 | 10 | 19.25* | 12.0.0* |
Эффективный доступ к буферу std::basic_stringbuf | P0408R7 | 11 | 17 | 19.29 (16.10)* | 15.0.0* |
| Совместимость представления и свойства взаимозаменяемости указателей (FTM)* (FTM)* | P0466R5 | 12 | 19.29 (16.10)** | ||
|
Побитовые операции: std::
| P0553R4 | 9 | 9 |
19.25** 19.28 (16.8)* | 11.0.3* |
| Математические константы (FTM)* | P0631R8 | 10 | 11 | 19.25* | 12.0.5* |
| Форматирование текста (FTM)* | P0645R10 | 13 | 14** 17 | 19.29 (16.10)* | 15.0.0* |
std::stop_token и std::jthread (FTM)* | P0660R10 | 10 |
17 (частично)* 20* | 19.28 (16.9)* | |
constexpr std::allocator и связанные утилиты (FTM)* | P0784R7 | 10 | 12 | 19.29 (16.10)* | 13.0.0* |
constexpr std::string (FTM)* |
P0426R1 P1032R1 P0980R1 | 12 | 15 |
19.29 (16.10)* 19.30** | 14.0.3* |
constexpr std::vector (FTM)* | 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 (FTM)* (FTM)* (FTM)* (FTM)* (FTM)* (FTM)* | P1135R6 | 11 | 11 | 19.28 (16.9)* | 13.1.6* |
std::source_location (FTM)* | P1208R6 | 11 |
15* (частично) 16 | 19.29 (16.10)* | 15.0.0* |
Добавление <=> в стандартную библиотеку | P1614R2 | 10 |
14* (частично) 17* (частично) 19 | 19.29 (16.10)* | 13.1.6* (частично) |
constexpr конструктор по умолчанию std::atomic и std::atomic_flag (FTM)* | P0883R2 | 10 | 13 | 19.26* | 13.1.6* |
| constexpr для числовых алгоритмов (FTM)* | P1645R1 | 10 | 12 | 19.26* | 13.0.0* |
| Безопасное сравнение целых чисел (FTM)* | P0586R2 | 10 | 13 | 19.27* | 13.1.6* |
| Возможность C++20 | Предложение(я) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
|---|
* — наведите курсор на ячейку, отмеченную звездочкой *, чтобы увидеть дополнительные примечания.
DRnn — число nn после «DR» обозначает редакцию C++, к которой применяется отчет об ошибке, например, DR20 → C++20.
Внешние ссылки
| 1. | C++20 — Википедия |
| 2. | Рабочие примеры C++20 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/20