Вышел C++23: обзор ключевых изменений нового стандарта
В мире языков программирования произошло знаковое событие — международный комитет по стандартизации C++ (ISO/IEC JTC1/SC22/WG21) официально утвердил новую версию языка: C++23. Этот релиз, пришедший на смену C++20, не является революционным, но содержит множество долгожданных и полезных улучшений, которые сделают код чище, безопаснее и производительнее. Давайте разберём самые важные нововведения.
Главные новинки C++23
1. std::print и std::println — современная замена cout
Пожалуй, самое заметное изменение для повседневного программирования. В стандартную библиотеку добавлены функции std::print и std::println, основанные на мощном форматировании из std::format (C++20). Теперь вывод в консоль стал не только удобнее, но и значительно быстрее, чем через std::cout.
- Пример:
std::println("Привет, {}! Ответ: {}", name, 42); - Преимущества: типобезопасность, читаемый синтаксис, поддержка Unicode.
2. deducing this (P0847R7) — явное указание на this
Одно из самых мощных нововведений для метапрограммирования и создания библиотек. Теперь можно явно передавать объект this как параметр функции-члена. Это решает старые проблемы с лямбдами и CRTP (Curiously Recurring Template Pattern).
- Позволяет писать одну функцию-член, которая работает и с const, и с не-const объектами.
- Упрощает реализацию паттерна "перегрузка по квалификаторам".
3. Многомерные операторы operator[] (P2128R6)
Долгожданная возможность — теперь operator[] может принимать несколько аргументов. Это критически важно для библиотек, работающих с многомерными массивами (например, mdspan или собственные матрицы).
- Было:
matrix(2, 3)илиmatrix[{2,3}] - Стало:
matrix[2, 3]— естественно и кратко.
4. std::expected — функциональная обработка ошибок
Альтернатива исключениям и кодам возврата. Тип std::expected<T, E> содержит либо корректное значение, либо ошибку. Это особенно ценно в системах, где исключения запрещены (встраиваемые системы, ядра ОС).
5. Улучшения модулей и концептов
Модули (C++20) получили исправления и стабилизацию. Теперь они лучше поддерживаются компиляторами. Концепты стали более гибкими, добавлена возможность использовать auto в параметрах концептов.
Что ещё стоит отметить?
std::mdspan— многомерный span для работы с массивами.- Исправления в
std::ranges— стабилизация и закрытие пробелов в API. - Атрибут
[[assume]]— подсказки компилятору для оптимизации. - Статические вызовы
operator()— возможность