Топ питань
Часова шкала
Чат
Перспективи
C++23
З Вікіпедії, вільної енциклопедії
Remove ads
C++23 — наступна версія міжнародного стандарту ISO/IEC 14882 мови програмування C++, яка прийшла на заміну версії C++20. Остаточний проєкт стандарту отримав код N4950[1][2].
В лютому 2020 року на зустрічі у Празі був ухвалений загальний план нововведень для C++23, зокрема:[3][4] підтримка співпрограм у стандартній бібліотеці, модуляризація стандартної бібліотеки, впровадження механізмів виконання (англ. executors), та мережеві інтерфейси.
Перша зустріч робочої групи WG21 присвячена C++23 мала відбутись на початку червня 2020 року у Варні (Болгарія), але була скасована через пандемію коронавірусу[5][6]. Так само була скасована наступна зустріч в листопаді 2020 року в Нью-Йорку (Сполучені Штати)[7][6] та в лютому 2021 в Кона (на Гаваях)[7]. Натомість, всі зустрічі до листопада 2022 року відбувались віддалено через інтернет до фінальної зустрічі в лютому 2023 року.[7] Стандарт був технічно доопрацьований WG21 на гібридній зустрічі в Іссаква в лютому 2023 року.[8]
Remove ads
Сучасний приклад «Hello, world»
Програма Hello, world! тепер має такий вигляд з використанням засобів стандарту C++23:
import std;
int main()
{
std::println("Hello, world!");
}
Оновлення у версії С++23
Узагальнити
Перспектива
Зміни, які були прийняті в C++23, включають:
Мова
- Параметр явного об'єкта
this
if consteval
- Багатовимірний підіндексний оператор
- Статичні оператори виклику та підрядкових індексів та статичні лямбда
- Спрощення неявного ходу
auto(x)
таauto{x}
- Нові директиви препроцесора:
- Подовження часу життя деяких тимчасових установок у циклі for на основі діапазону
- Новий стандартний атрибут
[[assume(expression)]]
- Вирахування аргументу шаблону класу з успадкованих конструкторів
- Мітки в кінці складеного оператора
- Оголошення псевдонімів в init-statements
- Літеральні суфікси for та відповідний знаковий тип
std::size_t
- Розширені типи з плаваючою комою з літералами (умовно підтримуються)
- Необов'язковий з нульових лямбда-виразів
()
- Атрибути в лямбда-виразах
constexpr
Зміни:- Нелітеральні змінні, мітки та s у функціях
gotoconstexpr
- Допустимі та змінні, які використовуються в константних виразах у функціях
static
,thread_localconstexpr
- Функція типу
constexpr
не потребує, щоб її тип повернення, і типи параметрів були літеральним типом - Тепер можна написати функцію, для якої жоден виклик не задовольняє вимогам основного виразу константи
constexpr
- Нелітеральні змінні, мітки та s у функціях
- Звуження контекстуальних перетворень до in та
bool
,static_assertif constexpr
- Обрізання пробілів перед зрощуванням ліній
- Зроблено обов'язковим макет для порядку оголошення
- Відокремлені екрановані послідовності
- Визначені загальні витоки символів
- Зміни в кодуванні тексту:
- підтримка UTF-8 як портативного кодування вихідного файлу
- Послідовне кодування символьних літер
- Набори символів та кодування
Бібліотека
Підтримка модулів стандартної бібліотеки
- стандартних модулів бібліотеки
std
таstd.compat
Підтримка бібліотеки Coroutine
Загальна підтримка утиліт
- Тип результату
std::expected
- Одинарні операції для і
std::optionalstd::expected
- Утиліта для отримання базового значення переліку
std::to_underlying
- Обгортка, що викликається лише рухом
std::move_only_function
std::forward_like
std::invoke_r
std::bind_back
std::byteswap
std::unreachable
: функція для позначення недоступного коду- Зроблено сумісним з іншими кортежними об'єктами
std::tuple
std::basic_common_reference
спеціалізація для отримання посилань для типівstd::reference_wrapper
- Додавання аргументів за замовчуванням для конструктора пересилання
std::pair
Підтримка під час компіляції
constexpr
Підтримка:std::type_info::operator==
std::bitset
std::unique_ptr
- для деяких функцій
<cmath>
- для інтегральних перевантажень і
std::to_charsstd::from_chars
- Утиліти метапрограмування:
- Типові знаки , , , і .
std::is_scoped_enumstd::is_implicit_lifetimestd::reference_constructs_from_temporarystd::reference_converts_from_temporary
Ітератори, діапазони та підтримка алгоритмів
- Нова функція перетворення діапазону
std::ranges::to
- Новий алгоритм обмежених діапазонів:
- Новий, допоміжний засіб для визначення замикань адаптерів із визначеним діапазоном
std::ranges::range_adaptor_closure
- Нові адаптери лінійки:
- Виправлення константних ітераторів, сентинелів та діапазонів, тобто та інших подібних утиліт, що повертають постійні ітератори, повинно бути повністю гарантовано навіть для неглибоких представлень (таких як )
std::ranges::cbeginstd::span
- Ітератори діапазонів як входи для алгоритмів, що не мають діапазонів
- Адаптери звільненого діапазону для використання лише типів зсуву
- Створення багатопараметричних конструкторів деяких представлень
explicit
Підтримка керування пам'яттю
Підтримка обробки рядків і тексту
- Нові функції-елементи та зміни в типах рядків:
std::basic_string_view::contains
іstd::basic_string::contains
- Відключення конструкції з for і
nullptrstd::basic_stringstd::basic_string_view
- Конструктор явних діапазонів для
std::basic_string_view
std::basic_string::resize_and_overwrite
- Еталонне перевантаження Rvalue для ефективного нарізання
std::basic_string::substr
- діапазони форматування, кортежі, екрановане представлення символів і рядків, а також трасування стека.
std::thread::id
Діагностична підтримка
Підтримка вводу/виводу
Підтримка контейнерів
- Багатовимірний перехід
std::mdspan
- Конструктивність і можливість призначення контейнерів з інших сумісних діапазонів
- Адаптери для контейнерів з плоским набором і плоскою картою
- Контекст без вирахування для розподільників у посібниках з вирахування контейнерів
- гетерогенні перевантаження стиранням для асоціативних контейнерів
- Дозвіл побудови пар ітераторів у стеку та черзі
- вимагаючи і бути тривіально скопійованим
std::spanstd::basic_string_view
Підтримка сумісності з мовою Сі
Звіти про дефекти мови
- Синтаксис ідентифікатора C++ з використанням Unicode Standard Annex 31
- Дозвіл дублювання атрибутів
- Зміна області застосування типу повернення кінця лямбди
- Зменшення кількості перевантажених операторів порівняння
- Призначення незалежних сполучень volatile
- Фіксація сумісності та переносимості
char8_t
- Пом'якшення вимог щодо відповідності існуючим практикам
wchar_t
- Допускання деяких вказівок і посилань або невідомого походження в константних виразах
this
- Впровадження негайно-реагуючих функцій, що переходять до безпосередніх функцій
- Дозволу у контекстах шаблонів без створення екземплярів
static_assert(false)
Звіти про дефекти в бібліотеці
- Зміни в бібліотеці діапазонів:
- Умовно запозичені діапазони
- Налагодження адаптерів та вхідного діапазону
std::counted_iterator
- Послаблення обмеження
std::ranges::join_view
- Перейменовано на нове
std::ranges::split_viewstd::ranges::lazy_split_viewsplit_view
- Видалено обмеження з концепції
std::default_initializablestd::ranges::view
- Переглянуто з правом власності та новим
std::ranges::owning_view
-
std::ranges::istream_view
- Зміни в бібліотеці форматування тексту:
std::basic_format_string
- Перевірка рядків формату під час компіляції
- зменшення розміру двійкового коду
std::format_to
- Виправлення локальної обробки у форматувальниках chrono
- Вдосконалення оцінки ширини та допусків до символів заповнення
std::format
- Використання посилань на посилання в аргументах формату для дозволу , які не є формату const
- Повністю і
constexprstd::variantstd::optional
- Підтримуваних типів , похідних від
std::variantstd::visit
Вилучені функції та застарілість
Видалені функції:
- Підтримка збору сміття та виявлення витоків на основі досяжності. Вона була додана до стандарту, починаючи з C++11, але жоден компілятор не підтримує цю функцію до C++23.
- Змішана широка рядкова літеральна конкатенація.
- Широкосимвольні літерали без кодування та багатосимвольні широкосимвольні літерали.
Застарілі функції:
Скасовано застарілі функції:
Remove ads
Опубліковано як Технічні характеристики
Підтримка компілятора
- Clang поступово додав часткову підтримку C++23 з 2021 року у версії 13 до версії 18 у 2024 році, доступну через опцію .
-std=c++23
- GCC додав часткову, експериментальну підтримку C++23 у 2021 році у версії 11 через опцію або Він також має можливість увімкнути розширення GNU на додаток до експериментальної підтримки C++23, .
-std=c++2b-std=c++23-std=gnu++2b
Історія
Узагальнити
Перспектива
За відсутності очних зустрічей WG21 після кількох віртуальних засідань WG21 були застосовані наступні зміни, де вони були затверджені шляхом опитування.[9]
Після віртуального засідання WG21 9 листопада 2020 року, де вони були затверджені шляхом спрощених опитувань, були додані наступні:
- Літеральні суфікси для і відповідний знаковий тип
std::size_t
- Функція-елемент для і , щоб перевірити, чи містить рядок заданий підрядок або символ
containsstd::basic_stringstd::basic_string_view
- Бібліотека stacktrace (), заснована на Boost. Трасування стека
<stacktrace>
- Типова ознака
std::is_scoped_enum
- Заголовок , для сумісності з атомами C
<stdatomic.h>
Після віртуального засідання WG21 22 лютого 2021 року додаються такі функції, де вони були схвалені шляхом спрощених опитувань: - Видалення непотрібного порожнього списку параметрів з лямбда-виразів.
()
- Ремонт адаптерів вхідного діапазону та .
counted_iterator
- Пом'якшити вимоги до .
time_point::clock
std::visit
для класів, які є похідними від .std::variant
- Замки, замки, що замикаються.
- Умовно запозичені діапазони.
std::to_underlying
.
Після літнього віртуального засідання 2021 року за стандартами ISO C++ у червні 2021 року нові функції та звіти про дефекти були затверджені шляхом спрощених опитувань:
- Продовжити, якщо ().
if consteval
- Звуження контекстних перетворень до .
bool
- Дозвіл дублювання атрибутів.
std::span
-based string-stream ().<spanstream>
std::out_ptr()
і.std::inout_ptr()
constexpr
для , та .std::optionalstd::variant
std::type_info::operator==
- Ітератори об'єднують конструктори для (стек) і (черга).
std::stackstd::queue
- Декілька змін у бібліотеці діапазонів:
- Узагальнені і для довільних діапазонів.
starts_withends_with
- Перейменовано на і створено нове .
split_view
,lazy_split_view
,split_view
- Послаблення обмеження на .
join_view
- Зняття обмежень з поняття .
default_initializableview
- Конструктор діапазонів для .
std::basic_string_view
- Узагальнені і для довільних діапазонів.
- Заборона і будівництво з
нуля
.std::basic_stringstd::basic_string_view
std::invoke_r
.- Удосконалення на .
std::format
- Додавання аргументів за замовчуванням для конструктора пересилання.
std::pair
Після осіннього віртуального засідання 2021 року за стандартами ISO C++ у жовтні 2021 року нові функції та звіти про дефекти були затверджені спрощеними опитуваннями:
- Нелітеральні змінні, мітки та goto у функціях, але все ще погано сформовані для їх обчислення під час компіляції.
constexpr
- Явно вказано параметр об'єкту
this
- Зміни в наборах символів і кодуваннях.
- Нові препроцесори: і . Обидві директиви були додані в C23 (оновлення мови C) і GCC 12.
#elifdef #elifndef
- Дозволено оголошення псевдонімів у виразах ініціалізації.
- Перевантаження багатовимірного підіндексного оператора (наприклад, ).
arr[1, 2]
- Копія розпаду в мові: або .
auto(x)auto{x}
- Зміни в бібліотеці форматування тексту:
- Виправлення локалізованої обробки у форматувальниках chrono.
- Використання посилань на посилання в аргументах типів для дозволу накшталт .
std::generator
- Додавання псевдоніма типу, який еквівалентний .
std::pmr::stacktracestd::basic_stacktrace<std::pmr::polymorphic_allocator>
- Зміни в бібліотеці діапазонів:
- Уточнене визначення виду.
- Заміна шаблону функції на шаблони псевдонімів , , та об'єкта точки налаштування .
std::ranges::istream_viewstd::ranges::istream_viewstd::ranges::wistream_viewstd::views::istream
zip
Сімейство адаптерів діапазону:zip_view
zip_transform_view
adjacent_view
(і є еквівалентомstd::views::pairwisestd::views::adjacent<2>
)adjacent_transform_view
(і є еквівалентомstd::views::pairwise_transformstd::views::adjacent_transform<2>
)
std::move_only_function
.- Одинарні операції для .
std::optional
- Шаблон функції-елемента .
std::basic_string::resize_and_overwrite
- Друк
volatile
покажчиків ().volatile T*
std::byteswap
.- Неоднорідні перевантаження стиранням для асоціативних контейнерів.
- Будь-яка спеціалізація і тривіально копіюється.
std::spanstd::basic_string_view
- Додавання умовних специфікацій до .
noexcept
std::exchange
- Оновлено специфікацію та використання цілочисельних типів класів.
- Уточнено заголовки C. "Заголовки не корисні в коді, який потрібен лише для того, щоб бути валідним C++. Таким чином, заголовки C повинні бути надані стандартною бібліотекою C++ як повністю підтримувана, а не застаріла частина, але їх також слід не рекомендувати використовувати в коді, який не є поліглотським кодом сумісності. [..] Ця пропозиція робить заголовки C більше не застарілими, тому немає формальної загрози майбутнього видалення. Ефективне знеохочення до використання заголовків C у чистому коді C++ тепер чітко прописано як нормативне знеохочення».
Після віртуального засідання WG21 7 лютого 2022 року додаються такі функції, де вони були схвалені спрощеними опитуваннями:
- Дозволені атрибути оператора виклику функцій лямбди
std::expected
constexpr
for таcmathcstdlib
- Функція позначення недоступного коду
ranges::to
- Ознака типу для виявлення прив'язки посилань до тимчасового типу
- Робить
std::unique_ptr
constexpr
- Підтримка міжпроцесних зв'язків (pipe) для адаптерів із заданим користувачем діапазоном
ranges::iota
іranges::shift_leftranges::shift_right
views::join_with
- Адаптери віконного діапазону: та
views::chunkviews::slide
views::chunk_by
Після віртуального засідання WG21 25 липня 2022 року додаються такі функції та звіти про дефекти, де вони були затверджені спрощеними опитуваннями:
- Зроблено переписування рівності у виразах менш кардинальною зміною.
- Скасовано застарілість побітового присвоєння змінним.
volatile
- Додано директиву препроцесора.
#warning
- Видалено широкі символьні літерали, які не підлягають кодуванню, та багатосимвольні широкосимвольні літерали.
- Дозволено створювати в кінці складених операторів.
- Додано екрановані послідовності, відокремлені фігурними дужками для вісімкових та шістнадцяткових чисел та універсальними назвами символів.
- Дозволено, щоб функції ніколи не були константними виразами.
constexpr
- Спрощено деякі неявні правила переміщення з C++20 та дозволено неявне переміщення при поверненні посилання rvalue.
- Додано спосіб задання символів юнікоду за іменем. Наприклад
U'\N{LATIN CAPITAL LETTER A WITH MACRON}' // Equivalent to U'\u0100'
- Дозволено
operator()
та lambda бутистатичними
. - Дозволено створювати покажчик та посилання невідомого походження у константних виразах
this
- Дозволено визначати в реалізації розширені типи з плаваючою комою на додаток до трьох стандартних типів з плаваючою комою. Додано псевдоніми типів , , , , для цих розширених типів, доступних через заголовок, їх відповідні літеральні суфікси або та додано перевантаження до різних стандартних функцій бібліотеки, які приймають числа як аргументи.
std::float16_t
std::float32_t
std::float64_t
std::float128_t
std::bfloat16_t[en]
<stdfloat>
f16
f32
f64
f128
bf16
F16
F32
F64
F128
BF16
- Додано атрибут, який дозволяє компілятору припустити, що наданий вираз є істинним, щоб дозволити оптимізацію.
[[assume(expression)]]
- Обов'язковою зроблено підтримку вихідних файлів UTF-8, що забезпечує переносне кодування вихідних файлів.
- Дозволено ініціалізовувати масиви та рядкові літерали[en] UTF-8.
char
unsigned char
- Видалено вимогу про те, що
wchar_t
може кодувати всі символи розширеного набору символів, фактично дозволяючи використовувати UTF-16 для широких рядкових літералів. - Додано представлення багатовимірного масиву, аналогічно .
std::mdspan
std::span
flat_map
і були додані до Стандартної бібліотеки.flat_set
- Додано функції та функції для друку форматованого тексту до стандартного виведення.
std::print
std::println
- Надано іменовані модулі та для імпорту стандартну бібліотеку.
std
std.compat
- Додано підтримку ексклюзивного режиму , аналогічного прапорцю "x" у форматі .
fstreams
fopen
- Дозволено обробляти діапазони, кортежі та інші контейнери.
std::format
- Додано.
std::forward_like
- Зроблено використовувати семантику руху.
std::string::substr
- Додано, що реалізує генератор співпрограм, який моделює
std::generatorstd::ranges::input_range
views::cartesian_product
, , , , .views::repeatviews::strideviews::as_constviews::as_rvalue
- Додано нові алгоритми: , , та алгоритми згортання діапазонів.
ranges::find_lastranges::contains
- Зроблено сумісним з іншими кортежними об'єктами.
std::tuple
- Явне управління життєвим часом для неявних типів.
- Зроблені та інтегральні перевантаження та -сумісні.
std::bitsetstd::to_charsstd::from_charsconstexpr
- Додавання типів лише з рухом підтримує концепції порівняння.
- Діапазони ітераторів як входи для алгоритмів, що не мають діапазонів.
- Адаптери звільненого діапазону для використання лише руху.
Після засідання гібридної WG21 7 листопада 2022 року додаються такі функції та звіти про дефекти, де вони були затверджені спрощеними опитуваннями:
- Допускається бути .
operator[]static
- Дозволені та
thread_local
змінні з'являтися у функціях, якщо вони використовуються в константних виразах.static
constexpr
consteval
поширюється вгору, тобто певні існуючі функції стають функціями, коли ці функції можуть бути викликані вже під час компіляції.constexprconsteval
- Збільшено час життя тимчасових символів, які з'являються в for-range ініціалізаторі циклу на основі діапазону, щоб покрити весь цикл.
for
- Скасовано застарілість (усіх, а не лише побітових) присвоєння сполук змінним.
volatile
- Одинарні функції для .
std::expected
- Синхронізуйте вихідні дані з базовим потоком, якщо використовується рідний API Unicode.
std::print
Після фінального засідання гібридної WG21 6-11 лютого 2023 року додаються такі функції та звіти про дефекти, де вони були затверджені солом'яними опитуваннями:
- Посилання на стандарт Unicode.
- Приховані ітератори для належного зведення.
views::enumerate
- Створення багатопараметричних конструкторів представлень явними
- Звільнені полігони просто дрібниця
- Уникнено покращень у
std::format
- Удосконалено оцінку ширини
std::format
std::format
Заповненння символьними дозволами- Форматування та
thread::idstacktrace
- Типова ознака
std::is_implicit_lifetime
std::common_reference_t
має бути еталонним типомstd::reference_wrapper
- Заборонено спеціалізацію користувача на
std::allocator_traits
std::pmr::generator
- Заборонено
std::numeric_limits::has_denorm
std::barrier
гарантії завершення етапу
Remove ads
Див. також
Вікіпідручник має книгу на тему
Примітки
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads