C++20 — название стандарта ISO/IEC языка программирования C++. Спецификация опубликована в декабре 2020 года.
 Комитет по стандартам C++ начал планировать C++20 в июле 2017 года. C++20 является преемником C++17.
 Константа __cplusplus увеличилась до 202002L.
 Так как модификатор volatile является машинозависимым и семантика операций над ним и количество обращений к памяти не ясны, для межпоточной синхронизации лучше использовать atomic.
 Запрещены следующие операции с volatile-переменными:
 Для atomic добавлены дополнительные функции, компенсирующие то, что запретили.
 В предыдущих стандартах агрегатная инициализация разрешалась, если конструктор был помечен как default или delete, что вводило пользователей в заблуждение: объект инициализируется в обход конструктора.
 Удалены редкие возможности стандартной библиотеки, запрещённые в C++17:
 Из языка удалили ремарку throw(), которую ещё в Си++11 заменили на noexcept. Если нужна совместимость с Си++03, в заголовках совместимости нужно прописывать что-то вроде
 Оставили:
 Директива компилятора #include в своё время была удобным механизмом Си, который, был, по сути, кроссплатформенным ассемблером, «паразитировавшим» на ассемблерных утилитах — линкере и библиотекаре. Отсюда важная черта компиляторов Си — они первыми после ассемблера появлялись на новых платформах. Но с расширением проектов квадратично повышалось время их компиляции: увеличивалось как количество единиц трансляции, так и количество подключённых к ним заголовков. Механизм модулей был долгим объектом споров ещё со времён Си++11.
 В Си++20 он вошёл в таком виде:
 Сопрограмма — это специальная бесстековая функция, которая может приостановить своё исполнение, пока выполняется другая функция. Состояние сопрограммы хранится в динамической памяти (кроме случаев, когда оптимизатору удалось избавиться от выделения). Выглядит как обычная функция, но содержит особые сопрограммные ключевые слова co_*.
 Физически сопрограмма — это функция, возвращающая свежесозданный объект-обещание. Каждый раз, когда пользователь делает что-то с объектом-обещанием, управление передаётся коду сопрограммы. В библиотеке должны быть доступны несколько стандартных обещаний — например, lazy<T> обеспечивает ленивое вычисление.
 По факту на Си++23 стандартная библиотека сопрограмм не выработана, и слово за экспериментаторами.
 В некоторых местах шаблонов слово typename (объяснение, что Object::Thing — это тип, а не функция) больше не требуется. К таким местам относятся…
 Размер массива в операторе new теперь дедуктируется автоматически
 В constexpr разрешено:
 Подобная конструкция в теории позволит, например, делать, чтобы константный std::vector просто указывал на память соответствующего std::initializer_list, а обычный неконстантный — отводил динамическую память.
 Расширен вызов лямбда-функций при компиляции — например, можно отсортировать std::tuple.
 constexpr-код не обязан вызываться при компиляции, и достаточно написать std::set<std::string_view> dic { "alpha", "bravo" };, чтобы constexpr-цепочка оборвалась на конструкторе std::set и произошла инициализация при выполнении. Иногда это нежелательно — если переменная используется при инициализации программы (известный недостаток Си++ — неконтролируемый порядок инициализации CPP-файлов), большая (например, большая таблица) или трудновычисляемая (инициализация той же таблицы, проводящаяся за O(n²)). И у программистов бывает просто спортивный интерес перенести код в компиляцию. Чтобы дать уверенность, используются два новых ключевых слова:
 Ключевое слово explicit можно писать вместе с константным булевским выражением: если оно истинно, преобразование возможно только явно. Упрощает метапрограммирование, заменяет идиому SFINAE.
 Для типа: запрещается любое неиспользование временного объекта данного типа.
 Для конструктора: запрещается вызов конструктора и потом неиспользование его результата..
 Операция <=> позволяет сравнивать объекты по одному из трёх методов:
 Название «звездолёт» произошло из старой игры по «Звёздному пути» — этими тремя символами обозначался «Энтерпрайз».
 Версия операции «звездолёт» с телом =default просто сравнивает все поля в порядке объявления. Также возможна операция «равняется» с телом =default, она также сравнивает все поля в порядке объявления и автоматически объявляет операцию «не равняется».
 Концепция — требования к параметрам шаблона, чтобы этот шаблон имел смысл. Большую часть жизни Си++ концепция описывалась устно, со сложными ошибками в заведомо действующих заголовках вроде STL, если программист не вписался в концепцию. Если же программист сам пишет шаблон, он может случайно выйти из концепции и не увидеть это на тестовой программе, ведь простейшие типы вроде int имеют множество функций по умолчанию вроде конструктора копирования, присваивания, арифметических операций.
 Обработка строк при компиляции была давней мечтой Си++, и очередной шажок к ней — строковые константы в шаблонах. В частности, хотелось бы преобразовывать регулярные выражения в байт-код уже при компиляции. На экспериментальных библиотеках регулярных выражений уже видели ускорение до 3000 раз по сравнению с std::regex.
 Порядковая инициализация структур Си Point p { 10, 20 }; ошибкоопасна, если ожидается расширение структуры или два соседних элемента можно спутать. В новый стандарт добавилось Point p { .x=10, .y=20 };, давно существовавшее в Си, но не формализированное в Си++.
 Кроме того, такая конструкция позволяет инициализировать именно тот вариант union, который нужно.
 Удалены по сравнению с Си:
 Лямбда-функции появились в Си++11 вдогонку за другими языками программирования. Решают сразу несколько вопросов: заменяют препроцессор, если надо исполнить один и тот же код в двух местах функции, а в отдельный объект/функцию вынести трудоёмко; переносят текст функции ближе к тому месту, где он требуется; позволяют писать в функциональном стиле. Названы так в честь лямбда-исчисления, одной из основ функционального программирования.
 Явный перехват объекта в лямбда-функции [=, this](){} и [=, *this](){}. Как сказано выше, неявный перехват this в лямбда-функциях запретили.
 Традиционный синтаксис лямбда-шаблонов вместо Си++14 [](auto x). Этот синтаксис удобнее, если нужно сделать самопроверку, или вычислить какой-нибудь производный тип.
 Лямбда-функции в невычисляемых контекстах:  сигнатурах, возвращаемых типах, параметрах шаблонов.
 Чтобы этот код работал, нужно ещё одно изменение — лямбда-функция без перехватов теперь имеет конструктор по умолчанию и операцию присваивания. Все экземпляры этого псевдокласса выполняют одно и то же, и никак нельзя заставить данную очередь с приоритетами сравнивать в другом порядке. Конструкторы копирования и перемещения были изначально у всех лямбда-функций.
 В списке перехвата лямбда-функции теперь можно держать операцию развёртывания вариативной части — раньше для этого приходилось подключать объект-кортеж. Например, данный шаблон возвращает лямбда-функцию, которую при желании можно вызвать когда угодно — она вызывает функцию foo() и уже содержит копии всех нужных для вызова данных.
 Уточнены условия, когда требуется неявно перемещать объект, особенно при выбросе исключений:
 Когда язык Си только зарождался, существовал «зоопарк» разных машин, и учебная машина MIX, придуманная Дональдом Кнутом, отражала это — байт мог хранить от 64 до 100 разных значений, а формат знаковых чисел не оговаривался. За сорок с лишним лет остановились на 8-битном байте и дополнительном коде, в первую очередь из-за простоты и интероперабельности, и это отметили в стандарте.
 Арифметическое переполнение в беззнаковой арифметике эквивалентно операциям по модулю, в знаковой — неопределённое поведение.
 Устно нерекомендуемый с Си++17 memory_order_consume, предназначенный для PowerPC и ARM, формализован и возвращается в обиход. Усилен memory_order_seq_cst.
 printf слишком низкоуровневый, опасный и нерасширяемый. Стандартные возможности Си++ позволяют только склеивать строки и потому неудобны для локализации.
 Потому в Си++20 сделали более типобезопасный механизм форматирования строк, основанный на Python.
 Возможности:
 std::string_view оказался отличным объектом, и сделали аналогичное для массивов — std::span. При этом span может изменять содержимое памяти, в отличие от string_view.
 Поток вывода, как правило, своими силами отрабатывает доступ из разных потоков исполнения. При многопоточном протоколировании возникает задача: собрать данные (например, строку текста) в буфер достаточной длины и одной операцией вывести их в поток.
 Для этого используется несложный класс, являющийся потомком ostream.
 Весь вывод в подчинённый поток происходит одной операцией в деструкторе.
 Сложная библиотека используется там, где нужно единообразно получить доступ, например, к std::vector и std::deque.
 Сложная библиотека для календарных расчётов.
 Буква j означает join — то есть при уничтожении объекта-потока система дожидается окончания задачи.
 Кроме того, с помощью библиотеки stop_token можно попросить поток остановиться.
 Барьер (barrier) — механизм межпоточной блокирующей синхронизации, действующий так: как только у барьера соберутся n потоков, он исполнит объект-функцию и отпустит их. Обычно используется для периодической координации частично распараллеливаемых задач: после того, как потоки исполнят каждый свою долю, срабатывает координатор и решает, что делать дальше.
 Засов (latch) — облегчённый одноразовый барьер.
 Основное назначение: ключи хранения — «тяжёлые» объекты (например, string), но в качестве ключа поиска допустимы и облегчённые: string_view и даже const char*. Реализовано оно крайне просто: добавлена шаблонная функция find, принимающая любой тип, сам же разнородный поиск включается типом-маркером is_transparent. Поддерживаются четыре функции: find, count, equal_range, contains. В Си++23 ожидается больше функций, поддерживающих разнородный поиск — например, erase.
 Для самобалансирующихся деревьев поиска (set/map) реализовано в Си++14. 
 Эта функция не включена по умолчанию из-за ошибкоопасности: преобразование типов может не сохранять те соотношения, на которых работает контейнер. Например, 1.0 < 1.1, но static_cast<int>(1.0) == static_cast<int>(1.1). Потому поиск дробного числа в set<int> приведёт не к тому, что надо. Так что программист сам должен допустить те альтернативные ключи, которые заведомо годятся.