سی‌پلاس‌پلاس ۲۳

**C++23** نام غیررسمی نسخه بعدی استاندارد ISO / IEC 14882 برای زبان برنامه‌نویسی سی‌پلاس‌پلاس است که از C++20 پیروی می‌کند. پیش‌نویس فعلی N4910 است.

در فوریه ۲۰۲۰، در نشست نهایی برای C++20 که در پراگ صورت گرفت، یک طرح کلی برای C++23 تصویب شد: ویژگی‌های برنامه‌ریزی‌شده برای C++23 شامل پشتیبانی کتابخانه برای کوروتین‌ها، کتابخانه استاندارد ماژولار، اجراکننده‌ها و شبکه می‌باشد.

اولین جلسه WG21 با تمرکز بر C++23 قرار بود در اوایل ژوئن ۲۰۲۰ در وارنا برگزار شود، اما به دلیل دنیاگیری کووید-۱۹ لغو شد، مانند نشست نوامبر ۲۰۲۰ در نیویورک و نشست فوریه ۲۰۲۱ در کایلوا، هاوایی. همه جلسات در حال حاضر تا نوامبر ۲۰۲۲ به صورت مجازی برنامه‌ریزی شده‌اند.

## سربرگ‌های جدید

* `<expected>`
* `<flat_map>`
* `<flat_set>`
* `<generator>`
* `<mdspan>`
* `<print>`
* `<spanstream>`
* `<stacktrace>`
* `<stdfloat>`

سربرگ‌هایی که از زبان C گرفته شده‌اند:

* `<stdatomic.h>`

## ویژگی‌های جدید
در جلسات غیابیِWG21، تاکنون چند ویژگی جدید به پیش‌نویس C++23 اضافه شده‌است. اما موارد زیر پس از جلسه مجازی WG21 در ۹ نوامبر ۲۰۲۰، که در نظرسنجی‌ها تأیید شدند، اضافه شدند:
* پسوندهای لفظی برای `std::size_t` و نوع علامت‌دار مربوطه.
* تابع عضو `contains` `std::basic_string` و `std::basic_string_view` تا بررسی کند رشته دارای یک زیررشته یا کاراکتر است یا خیر.
* کتابخانه `<stacktrace>`، بر اساس Boost.Stacktrace
*  `std::is_scoped_enum`
* سربرگ `<stdatomic.h>`، برای تطبیق با اتمیک‌های C

پس از نشست مجازی WG21 در ۲۲ فوریه ۲۰۲۱، ویژگی‌های زیر که توسط نظرسنجی‌ها تأیید شدند اضافه می‌شوند:
* بازسازی آداپتورهای Range ورودی و `counted_iterator` .
* حذف لیست پارامترهای خالی غیرضروری `()` از عبارات لامبدا.
* ریلکس‌سازی شرایط مورد نیاز برای `time_point::clock`.
* `std::visit` برای کلاس‌هایی که از `std::variant` مشتق شده‌اند.
* قفل‌کردن قفل‌شونده‌ها.
* Rangeهای شرطی اقتباسی.
* `std::to_underlying`.

پس از نشست مجازی عمومی استانداردهای ISO در ژوئن ۲۰۲۱، ویژگی‌های جدید و گزارش‌های نقص توسط نظرسنجی‌ها تأیید شد:
* 
* محدود کردن تبدیل‌های متنی به .
* اجازه دادن به صفت‌های تکراری
* `std::span` بر مبنای جریان رشته `<spanstream>`.
* `std::out_ptr` و `std::inout_ptr` .
*  برای `std::optional` ، `std::variant` ، و `== std::type_info::operator` .
* سازنده‌های جفت‌تکرارشونده برای `std::stack` (stack) و `std::queue` (queue).
* چند تغییر در کتابخانه ranges:
** تعمیم `starts_with` و `ends_with` برای محدوده‌های دلخواه.
** `split_view` به `lazy_split_view` تغییر نام داد و `split_view` جدید ایجاد شد.
** رفع محدودیت در `join_view` .
** حذف محدودیت `default_initializable` از `view` مفهومی.
** سازنده Range برای `std::basic_string_view` .
* ممنوعیت ساخت `std::basic_string` و `std::basic_string_view` از .
* `std::invoke_r` .
* بهبود در `std::format` .
* افزودن آرگومان‌های پیش‌فرض برای سازنده فورواردینگ `std::pair` .

پس از نشست مجازی عمومی استانداردهای ISO در اکتبر ۲۰۲۱، ویژگی‌های جدید و گزارش‌های نقص توسط نظرسنجی‌ها تأیید شد:
* متغیرهای غیر لفظی، برچسب‌ها و gotoها در توابع ، اما هنوز برای ارزیابی آنها در زمان کامپایل درست نیستند.
*  واضح برای پارامتر شیء.
* تغییرات در مجموعه کاراکترها و رمزگذاری‌ها.
* پیش‌پردازشگرهای جدید: `#elifdef` و `#elifndef` .
* اجازه دادن به اعلان‌های alias در init-statement.
* بارگذاری بیش از حد اپراتور مشترک چندبُعدی (به عنوان مثال `arr[1, 2]`).
* کپی Decay در زبان:  یا `{``x}auto`.
* تغییرات در کتابخانه قالب‌بندی متن:
** رفع کنترل محلی در قالب‌کننده‌های کرونو.
** استفاده از ارجاعات فوروارد در آرگومان‌های فرمت برای اجازه‌دادن به انواع شبهِ `std::generator`.
* اضافه کردن نوع `std::pmr::stacktrace` که معادل `std::basic_stacktrace<std::pmr::polymorphic_allocator>` است.
* تغییرات در کتابخانه ranges:
** تعریف دقیق view.
** جایگزینی الگوی تابع `std::ranges::istream_view` با الگوهای مستعار `std::ranges::istream_view` ، `std::ranges::wistream_view` ، و شی پوینت سفارشی‌سازی `std::views::istream` .
** خانواده آداپتورهای رنج `zip`:
*** `zip_view`
*** `zip_transform_view`
*** `adjacent_view` (و `std::views::pairwise` معادل `std::views::adjacent<2>`)
*** `adjacent_transform_view` (و `std::views::pairwise_transform` معادل `std::views::adjacent_transform<2>`)
* `std::move_only_function` .
* عملیات مونادیک برای `std::optional` .
* قالب تابع عضو `std::basic_string::resize_and_overwrite` .
* چاپ نشانگرهای فرار ().
* `std::byteswap` .
* اضافه‌بارهای پاک کردن ناهمگن برای ظروف انجمنی.
* هر خصوصیتی از `std::span` و `std::basic_string_view` قابل کپی‌کردن است.
* افزودن خصیصه‌های  شرطی به `std::exchange` .
* خصوصیات اصلاح شده و استفاده از انواع کلاس عدد صحیح.
* هدرهای C واضح‌تر شدند. هدرها در کدهایی که *فقط* باید سی‌پلاس‌پلاس معتبر باشند، مفید *نیستند*. بنابراین، هدرهای C باید توسط کتابخانه استاندارد سی‌پلاس‌پلاس به‌عنوان یک بخش کاملاً پشتیبانی‌شده و نه منسوخ ارائه شوند، اما همچنین باید از استفاده از آنها در کدهایی که کد قابلیت همکاری چند زبانه نیستند، جلوگیری کرد. [. .] این پیشنهاد باعث می‌شود هدرهای C دیگر منسوخ نشوند، بنابراین هیچ تهدید رسمی‌ای برای حذف در آینده وجود ندارد.»

پس از نشست مجازی WG21 در ۷ فوریه ۲۰۲۲، ویژگی‌های زیر که توسط نظرسنجی‌ها تأیید شدند اضافه می‌شوند:
* `std::expected`
* `constexpr` برای `cmath` و `cstdlib`
* تابع علامت‌گذاری کد غیرقابل دسترسی
* `ranges::to`
* منسوخ‌شدنِ `std::aligned_storage` و `std::aligned_union.`
* یک type trait برای تشخیص اتصال مرجع به موقت.
* `constexpr` شدنِ `std::unique_ptr`
* پشتیبانی پایپ برای آداپتورهای محدوده تعریف شده توسط کاربر.
* `ranges::iota` ، `ranges::shift_left` و `ranges::shift_right`
* `views::join_with`
* آداپتورهای محدوده پنجره: `views::chunk` و `views::slide`
* `views::chunk_by`

## ویژگی‌های حذف شده
* پشتیبانی جمع‌آوری زباله که در C++11 اضافه شده بود، با وجود بسیاری از پیاده‌سازی‌های GC موجود برای سی‌پلاس‌پلاس حذف شد. Garbage Collection در سی‌پلاس‌پلاس به وضوح برای یکسری برنامه خاص مفید است. با این حال، جمع‌آوری زباله همان‌طور که توسط استاندارد مشخص شده‌است برای آن برنامه‌ها مفید نیست.

## منابع

رده:خانواده زبان برنامه‌نویسی الگول
رده:خانواده زبان برنامه‌نویسی سی++
رده:زبان‌های برنامه‌نویسی ایستا
رده:زبان‌های برنامه‌نویسی سطح بالا
رده:سی++