Топ питань
Часова шкала
Чат
Перспективи
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_likestd::invoke_rstd::bind_backstd::byteswapstd::unreachable: функція для позначення недоступного коду- Зроблено сумісним з іншими кортежними об'єктами
std::tuple std::basic_common_referenceспеціалізація для отримання посилань для типівstd::reference_wrapper- Додавання аргументів за замовчуванням для конструктора пересилання
std::pair
Підтримка під час компіляції
constexprПідтримка:std::type_info::operator==std::bitsetstd::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::variantstd::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_viewzip_transform_viewadjacent_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 - Додавання умовних специфікацій до .
noexceptstd::exchange - Оновлено специфікацію та використання цілочисельних типів класів.
- Уточнено заголовки C. "Заголовки не корисні в коді, який потрібен лише для того, щоб бути валідним C++. Таким чином, заголовки C повинні бути надані стандартною бібліотекою C++ як повністю підтримувана, а не застаріла частина, але їх також слід не рекомендувати використовувати в коді, який не є поліглотським кодом сумісності. [..] Ця пропозиція робить заголовки C більше не застарілими, тому немає формальної загрози майбутнього видалення. Ефективне знеохочення до використання заголовків C у чистому коді C++ тепер чітко прописано як нормативне знеохочення».
Після віртуального засідання WG21 7 лютого 2022 року додаються такі функції, де вони були схвалені спрощеними опитуваннями:
- Дозволені атрибути оператора виклику функцій лямбди
std::expectedconstexprfor таcmathcstdlib- Функція позначення недоступного коду
ranges::to- Ознака типу для виявлення прив'язки посилань до тимчасового типу
- Робить
std::unique_ptrconstexpr - Підтримка міжпроцесних зв'язків (pipe) для адаптерів із заданим користувачем діапазоном
ranges::iotaіranges::shift_leftranges::shift_rightviews::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_tstd::float32_tstd::float64_tstd::float128_tstd::bfloat16_t[en]<stdfloat>f16f32f64f128bf16F16F32F64F128BF16 - Додано атрибут, який дозволяє компілятору припустити, що наданий вираз є істинним, щоб дозволити оптимізацію.
[[assume(expression)]] - Обов'язковою зроблено підтримку вихідних файлів UTF-8, що забезпечує переносне кодування вихідних файлів.
- Дозволено ініціалізовувати масиви та рядкові літерали[en] UTF-8.
charunsigned char - Видалено вимогу про те, що
wchar_tможе кодувати всі символи розширеного набору символів, фактично дозволяючи використовувати UTF-16 для широких рядкових літералів. - Додано представлення багатовимірного масиву, аналогічно .
std::mdspanstd::span flat_mapі були додані до Стандартної бібліотеки.flat_set- Додано функції та функції для друку форматованого тексту до стандартного виведення.
std::printstd::println - Надано іменовані модулі та для імпорту стандартну бібліотеку.
stdstd.compat - Додано підтримку ексклюзивного режиму , аналогічного прапорцю "x" у форматі .
fstreamsfopen - Дозволено обробляти діапазони, кортежі та інші контейнери.
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змінні з'являтися у функціях, якщо вони використовуються в константних виразах.staticconstexpr 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