10 Глоссарий....511
9 Дополнительное тестирование....498
8 С++23 и не только....462
8.1 С++23....463
8.1.1 Библиотека сопрограмм....463
8.1.2 Модуляризированная стандартная библиотека для модулей....477
8.1.3 Исполнители....480
8.1.4 Сетевая библиотека....484
8.2 С++23 или позже....486
8.2.1 Контракты....486
8.2.2 Рефлексия....489
8.2.3 Сопоставление с образцом....493
8.3 Дополнительная информация о стандарте С++23....497
Эпилог....459
Дополнительная информация....461
7 Практические примеры....414
7.1 Быстрая синхронизация потоков....415
7.1.1 Условные переменные....416
7.1.2 std::atomic_flag....418
7.1.3 std::atomic....421
7.1.4 Семафоры....423
7.1.5 Общая статистика....425
7.2 Вариации объектов future....426
7.2.1 Ленивый объект future....429
7.2.2 Выполнение на другом потоке....432
7.3 Модификация и обобщение генератора....437
7.3.1 Изменения....441
7.3.2 Обобщение....444
7.4 Различные потоковые архитектуры, основанные на задачах....448
7.4.1 Прозрачная архитектура ожидающего потока задач....448
7.4.2 Автоматическое возобновление ожидающей задачи....451
7.4.3 Автоматическое возобновление ожидающего объекта на отдельном потоке....454
5 Стандартная библиотека....210
5.1 Библиотека диапазонов....211
5.1.1 Концепты ranges и views....212
5.1.2 Работа алгоритмов непосредственно со всем контейнером....213
5.1.3 Композиция функций....217
5.1.4 Отложенное выполнение....219
5.1.5 Определение видов....222
5.1.6 Аромат Python....225
5.2 std::span....231
5.2.1 Статическая и динамическая длина....231
5.2.2 Автоматический вывод размера непрерывной последовательности объектов....233
5.2.3 Создание std::span из указателя и размера....234
5.2.4 Изменение объектов, к которым происходит обращение через ссылку....236
5.2.5 Обращение к элементам std::span....237
5.2.6 Постоянный диапазон изменяемых элементов....239
5.3 Улучшения контейнеров....242
5.3.1 Контейнеры и алгоритмы со спецификатором constexpr....242
5.3.2 std::array....243
5.3.3 Последовательное удаление из контейнеров....245
5.3.4 contains для ассоциативных контейнеров....250
5.3.5 Проверка строки на наличие префикса и суффикса....253
5.4 Арифметические функции....256
5.4.1 Безопасное сравнение целых чисел....256
5.4.2 Математические константы....261
5.4.3 Вычисление середины отрезка и линейная интерполяция....263
5.4.4 Работа с битами....264
5.5 Календарные зоны и часовые пояса....270
5.5.1 Время дня....271
5.5.2 Календарные даты....274
5.5.3 Часовые пояса....290
5.6 Библиотека форматирования ....297
5.6.0.1 Функции форматирования....297
5.6.1 Форматная строка....299
5.6.2 Задаваемые пользователем типы....307
5.7 Дальнейшие улучшения....313
5.7.1 std::bind_front....313
5.7.2 std::is_constant_evaluated....315
5.7.3 std::source_location....317
4 Ядро языка....56
4.1 Концепты....56
4.1.1 Два неправильных подхода....57
4.1.2 Преимущества концептов....63
4.1.3 Длинная, длинная история....63
4.1.4 Использования концептов....64
4.1.5 Ограниченные или неограниченные заполнители (Constrained and Unconstrained Placeholders)....76
4.1.6 Сокращенные шаблонные функции....79
4.1.7 Предопределенные концепты....83
4.1.8 Определение концептов....89
4.1.9 Применение концептов....97
4.2 Модули....109
4.2.1 Зачем нам нужны модули?....109
4.2.2 Преимущества использования модулей....115
4.2.3 Первый пример....116
4.2.5 Экспорт....121
4.2.6 Рекомендации по структуре модуля....122
4.2.7 Блок интерфейса модуля и блок реализации модуля....123
4.2.8 Подмодули и разделы модулей ....126
4.2.9 Шаблоны в модулях....130
4.2.10 Линковка на уровне модулей....133
4.2.11 Заголовочные блоки (header units)....135
4.3 Оператор трехстороннего сравнения....137
4.3.1 Упорядочение до С++20....137
4.3.2 Упорядочение начиная со стандарта С++20....139
4.3.3 Категории сравнения....142
4.3.4 Создаваемый компилятором оператор трехстороннего сравнения....144
4.3.5 Переписывание выражений (rewriting expressions)....149
4.3.6 Задаваемые пользователем и создаваемые автоматически операторы сравнения....152
4.4 Назначенная инициализация....155
4.4.1 Агрегированная инициализация....155
4.4.2 Именованная инициализация членов класса....157
4.5 consteval и constinit....162
4.5.1 consteval....162
4.5.2 constinit....164
4.5.3 Выполнение функций....165
4.5.4 Инициализация переменных....167
4.5.5 Исправляем проблему порядка статической инициализации....168
4.6 Улучшение работы с шаблонами....174
4.6.1 Условный явный конструктор....174
4.6.2 Нетипизированные параметры шаблона....177
4.7 Улучшения лямбд....181
4.7.1 Шаблонные параметры для лямбд....181
4.7.2 Определение неявного копирования указателя this....185
4.7.3 Лямбды в контекстах без выполнения. Использование конструктора по умолчанию и копирования для лямбд без состояния....187
4.8 Новые атрибуты....191
4.8.1 [[nodiscard("reason")]]....192
4.8.2 [[likely]] и [[unlikely]]....196
4.8.3 [[no_unique_address]]....197
4.9 Дополнительные улучшения....200
4.9.1 volatile....200
4.9.2 Оператор цикла for с инициализацией на основе диапазона....202
4.9.3 Виртуальная функция с constexpr....203
4.9.4 Новый символьный тип для utf8-строк: char8_t....205
4.9.5 Использование using enum в локальной области видимости....206
4.9.6 Инициализаторы по умолчанию для битовых полей....207
3 С++20....32
3.1 Большая четверка....33
3.1.1 Концепты....33
3.1.2 Модули....34
3.1.3 Библиотека диапазонов (ranges)....35
3.1.4 Корутины....36
3.2 Ядро языка....38
3.2.1 Оператор трехстороннего сравнения....38
3.2.2 Назначенная инициализация....39
3.2.3 consteval и constinit....41
3.2.4 Улучшения работы с шаблонами....42
3.2.5 Улучшения лямбд....43
3.2.6 Новые атрибуты....43
3.3 Стандартная библиотека....44
3.3.1 std::span....44
3.3.2 Улучшения контейнеров....45
3.3.3 Арифметические утилиты....45
3.3.4 Календарь и временные зоны (часовые пояса)....45
3.3.5 Библиотека для форматированного вывода....46
3.4 Параллельность....47
3.4.1 Атомарные операции....47
3.4.2 Семафоры....48
3.4.3 Защелки и барьеры....48
3.4.4 Кооперативное прерывание....49
3.4.5 std::jthread....51
3.4.6 Синхронные выходные потоки....52
Детали....55
2 Стандартизация....28
2.1 Стадия 3....29
2.2 Стадия 2....29
2.3 Стадия 1....29
Краткий обзор С++20....31
1 Исторический контекст....26
1.1 С++98....26
1.2 С++03....27
1.3 TR1....27
1.4 С++11....27
1.5 С++14....27
1.6 С++17....27
О С++....25
6 Параллельность....319
6.1 Корутины....320
6.1.1 Функция-генератор....321
6.1.2 Характеристики....324
6.1.3 Фреймворк....326
6.1.4 Ожидаемые и ожидающие объекты....329
6.1.5 Исполняемый поток процессов....331
6.1.6 co_return....335
6.1.7 co_yield....337
6.1.8 co_await....340
6.2 Атомарные переменные....350
6.2.1 std::atomic_ref....350
6.2.2 Атомарный умный указатель....359
6.2.3 Расширения std::atomic_flag....363
6.2.4 Расширения std::atomic....371
6.3 Семафоры....375
6.4 Защелки и барьеры....380
6.4.1 std::latch....380
6.4.2 std::barrier....386
6.5 Координированное прерывание....390
6.5.1 std::stop_source....391
6.5.2 std::stop_token....392
6.5.3 std::stop_callback....392
6.6 std::jthread....399
6.6.1 Автоматическое присоединение....400
6.6.2 Кооперативное прерывание std::jthread....402
6.7 Синхронизированные потоки вывода....405
В этой книге подробно рассказывается о новом стандарте С++20. Для тех, кто незнаком с С++20, приводится краткий обзор, далее рассматриваются ключевые возможности языка. Вы получите представление о ключевых изменениях в ядре языка (концепты и модули), новой библиотеке диапазонов, корутинах, а затем сможете применить теорию на практике, изучив ряд примеров. Книгу можно использовать как справочное руководство и изучать главы в удобном для вас порядке.Издание будет полезно разработчикам, желающим освоить последнюю версию С++, изучить передовые возможности и добавления в язык, а также заглянуть за кулисы разработки новых стандартов языка и узнать, как предлагаются, обсуждаются и утверждаются новые изменения в стандарт С++ и чем вызваны эти изменения.