کمیته استانداردسازی زبان ++C سازمان بینالمللی استانداردسازی (ISO) نسخه نهایی مشخصاتی را که استاندارد بینالمللی "C++26" را تشکیل میدهد، تأیید کرد. ویژگیهای ارائه شده در این مشخصات، در حال حاضر تا حدی در کامپایلرهای GCC، Clang و Microsoft Visual C++ پشتیبانی میشوند. کتابخانههای استانداردی که از C++26 پشتیبانی میکنند، در پروژه Boost پیادهسازی شدهاند.
طی دو ماه آینده، مشخصات تایید شده وارد مرحله آمادهسازی سند خواهد شد که طی آن اصلاحات ویرایشی برای رفع خطاهای املایی و تایپی انجام خواهد شد. در اوایل نوامبر، نسخه نهایی سند برای انتشار تحت نام رسمی ISO/IEC 14882:2026 به ISO ارسال خواهد شد.
ویژگیهای کلیدی C++26:
- عناصر برنامهنویسی قرارداد (Contracts) پیادهسازی شدهاند و به شما امکان میدهند مشخصات رابط رسمی را با استفاده از سه عملگر جدید تعریف کنید: pre (پیششرط)، post (پسشرط) و contract_assert (بررسی ادعا). عملگر "pre" پیششرطهایی را تعریف میکند که باید قبل از فراخوانی رعایت شوند (اعتبارسنجی ورودی)؛ "post" شرایطی را تعریف میکند که باید پس از اجرا رعایت شوند (الزامات خروجی)؛ contract_assert شرایط لازم برای ایجاد استثنائات را تعریف میکند. این ویژگی در GCC 16 در دسترس خواهد بود. int f(const int x) pre (x != 1) // الزامات ورودی post (r : r == x && r != 2) // الزامات نتیجه؛ r مقداری است که نتیجه آن { contract_assert (x != 3); return x; }
- پشتیبانی از بازتاب (Reflection) اضافه شده است که امکان مشاهده و اصلاح عناصر برنامه را در زمان کامپایل فراهم میکند. عملگرهای جدید "^^" برای به دست آوردن فرااطلاعات در مورد ساختار گرامر و "[:…:]" برای انجام تبدیل معکوس اضافه شدهاند. کتابخانه std::meta برای تبدیل و پردازش اطلاعات به دست آمده در طول بازرسی ارائه شده است و ویژگیهایی مانند محاسبات با ثابتها در دسترس هستند. پشتیبانی از بازتاب در GCC 16 اضافه خواهد شد. constexpr int i = 42, j = 42; constexpr std::meta::info r = ^^i, s = ^^i; static_assert(r == r && r == s); static_assert(^^i != ^^j); // 'i' و 'j' مقادیر متفاوتی دارند. static_assert(constant_of(^^i) == constant_of(^^j)); // 'i' و 'j' یکسان هستند static_assert(^^i != std::meta::reflect_constant(42)); // با مقدار ۴۲ متفاوت است
- «الگوی for» برای تکرار روی عناصری مانند بستههای پارامتر، اشیاء شبیه تاپل و نتایج بازتاب (فرااشیاء) در زمان کامپایل به سبک یک حلقه for معمولی اضافه شده است. هنگام اجرای «الگوی for»، بدنه حلقه برای هر عنصر گسترش مییابد و هر تکرار در یک دامنه جداگانه پردازش میشود که در آن متغیر در حال تغییر در حلقه ثابت است. در زمینه بازتاب، «الگوی for» میتواند برای تکرار روی ویژگیهای کلاسها یا enumها استفاده شود. این ویژگی در GCC 16 در دسترس خواهد بود. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } به این صورت گسترش مییابد: void f() { { constexpr auto&& __range = std::array{1, 2, 3}; constexpr auto __begin = __range.begin(); constexpr auto __expansion-size = __range.end() — __begin; // 3 { constexpr int I = *(__begin + 0); static_assert(I < 4); } { constexpr int I = *(__begin + 1); static_assert(I < 4); } { constexpr int I = *(__begin + 2); static_assert(I < 4); } } }
- چارچوب std::execution برای اجرای ناهمزمان و موازی کد اضافه شده است. این چارچوب اشیاء زمانبند را فراهم میکند که زمانبند کار (thread، thread pool، GPU، حلقه رویداد) را تعریف میکنند، اشیاء فرستنده را که کاری را که باید اجرا شود تعریف میکنند و اشیاء گیرنده را که نتیجه را مدیریت میکنند. using namespace std::execution; scheduler auto sch = thread_pool.scheduler(); sender auto begin = schedule(sch); sender auto hi = then(begin, []{ std::cout < "سلام دنیا! یک int داشته باشید."; return 13; }); sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); auto [i] = this_thread::sync_wait(add_42).value();
- کتابخانه std::simd برای موازیسازی عملیات داده با استفاده از مجموعه دستورالعملهای SIMD مانند AVX-512 و NEON با استفاده از سیستم نوع استاندارد C++ اضافه شده است. a = {1.0f، 2.0f، 3.0f، 4.0f}; std::simd b = {5.0f، 6.0f، 7.0f، 8.0f}; نتیجه std::simd = a + b;
- پیادهسازی یک بردار (آرایه) با اندازه متغیر std::inplace_vector پیشنهاد شده است. این بردار روی پشته تخصیص داده میشود و اندازه آن در زمان کامپایل تعیین میشود. این API مشابه std::vector است، اما عناصر آرایه به صورت داخلی ذخیره میشوند، نه روی هیپ. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
- دستورالعمل "#embed" برای جاسازی منابع باینری در کد اضافه شده است. const unsigned char icon_display_data[] = { #embed "art.png" };
- پشتیبانی از تولید و مدیریت استثنائات در زمان کامپایل، زمانی که خطاها در زمینه constexpr رخ میدهند، اضافه شد. constexpr std::optional تابع checked_divide(unsigned n, unsigned d) { تابع try { تابع تقسیم n, d را برمیگرداند; } تابع catch (...) { تابع std::nullopt را برمیگرداند; } } تابع constexpr date تابع parse_date(std::string_view input) { تابع auto [correct, year, month, day] = ctre::match<“([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})”>(input); تابع if (!correct) { تابع throw incorrect_date{input}; } تابع return build_date(year, month, day); }
- ساختار داده std::hive برای ذخیرهسازی نامرتب دادهها و استفاده مجدد از حافظه آزاد شده توسط عناصر حذف شده پیادهسازی شده است. این ساختار برای بارهای کاری با افزایش و کاهش شدید عناصر به ترتیب دلخواه بهینه شده است. برخلاف آرایهها، حذف یک عنصر در std::hive عناصر دیگر را جابجا نمیکند، بلکه عنصر حذف شده را به عنوان خالی علامتگذاری میکند و سپس با اضافه شدن عنصر جدید، جای خالی را پر میکند.
- کتابخانه std::linalg با API مبتنی بر BLAS برای جبر خطی اضافه شد.
- پشتیبانی از مکانیزم همگامسازی Hazard Pointer اضافه شده است، که از آزادسازی حافظه برای اشیاء که توسط نخهای دیگر بدون قفل کردن قابل دسترسی هستند، جلوگیری میکند. هنگامی که یک شیء حذف میشود، فقط به عنوان حذف شده علامتگذاری میشود، اما حافظه اشغال شده توسط شیء تنها پس از اینکه همه نخها نشانگر خطر تنظیم شده در طول دسترسی به شیء را آزاد کردند، آزاد میشود.
- پشتیبانی از مکانیزم همگامسازی RCU (بهروزرسانی خواندن-کپی) اضافه شد. عملیات نوشتن، یک نمونه جدید از شیء ایجاد میکند، در حالی که عملیات خواندن مسدود نمیشود، بلکه به کار با نمونه قدیمی ادامه میدهد. پس از تکمیل تغییر، نمونه جدید فعال میشود و عملیات خواندن جدید روی آن انجام میشود، در حالی که نمونه قدیمی پس از اتمام خواندن توسط نخها حذف میشود.
- تغییراتی برای تقویت ایمنی کتابخانه استاندارد، مانند بررسی مقادیر معتبر و سرریز بافر، ایجاد شده است. برای مثال، هنگام دسترسی به عنصر "constexpr reference operator[](size_type idx) const;"، بررسی شرط "idx < size()" اضافه میشود.
- امکان استفاده از کلمه کلیدی constexpr به همراه نوعی از عملگر new (جایگذاری new) برای قرار دادن یک شیء در حافظه از پیش تخصیص یافته در زمان کامپایل فراهم شده است.
- پشتیبانی از پیوندهای ساختاریافته در زمینه "constexpr" اضافه شده است، به این معنی که ارجاعات به عبارات ثابت اکنون میتوانند خود عبارات ثابت باشند. این پشتیبانی برای آرایهها و ساختارهای ساده پیادهسازی شده است. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- پیوندهای ساختاریافته اکنون از سینتکس "..." برای مشخص کردن بستههایی که تعداد باقیمانده عناصر در توالی انتساب را در بر میگیرند، پشتیبانی میکنند. auto [x,y,z] = f(); // متغیرهای x، y، z شامل سه عنصر بازگردانده شده توسط f() خواهند بود. auto [...xs] = f(); // بسته xs شامل تمام عناصر بازگردانده شده توسط f() خواهد بود. auto [x, ...rest] = f(); // x شامل عنصر اول و rest شامل بقیه خواهد بود. auto [x, y, ...rest] = f(); // x شامل عنصر اول، y شامل عنصر دوم و rest شامل عنصر سوم خواهد بود. auto [x, ...rest, z] = f(); // x شامل عنصر اول، rest شامل عنصر دوم و z شامل عنصر سوم خواهد بود.
- پشتیبانی از "Trivial Relocatability" برای انواع داده اضافه شده است، که امکان بهینهسازی حرکت اشیاء از یک نوع داده شده را با کلون کردن آنها در حافظه بدون فراخوانی سازندهها یا مخربها فراهم میکند. ویژگیهای memberwise_trivially_relocatable و memberwise_replaceable برای کلاسها پیادهسازی شدهاند و توابع trivially_relocate_at و trivially_relocate برای حرکت سطح پایین یک یا چند شیء اضافه شدهاند.
- پشتیبانی برای اتصال تابع main() به یک ماژول سراسری و تعریف تابع main() در ماژولهای نامگذاری شده پیادهسازی شده است.
- عملگر متغیر "friend" ("friend Ts...") اضافه شد.
- ویژگیهای پیادهسازیشده برای پیوندهای ساختاریافته؛
- سینتکس '= delete("reason")' اضافه شد.
- مجموعه کاراکترهای پایه شامل "@"، "$" و "`" میشود.
- امکان استفاده از اتصال ساختاریافته به عنوان یک شرط در دستورات if و switch فراهم شده است.
- قابلیت استفاده از چندین متغیر جاینگهدار با نام "_" در یک محدوده اضافه شد؛ برای مثال، ساختارهای زیر اکنون صحیح هستند: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // قبلاً در حالت -Wunused هشداری نمایش داده میشد }
- امکان استفاده از لیترالهای رشتهای در زمینههایی که برای مقداردهی اولیه آرایه کاراکتری استفاده نمیشوند و در کد حاصل ظاهر نمیشوند، بلکه فقط در زمان کامپایل برای پیامهای تشخیصی و پیشپردازش استفاده میشوند، به عنوان مثال، به عنوان پارامترهایی برای دستورالعملها و ویژگیهای _Pragma، asm، extern، static_assert، [[deprecated]] و [[nodiscard]].
- توابع داخلی اضافه شده است: "__builtin_is_within_lifetime" برای بررسی اینکه آیا یک جایگزین در union ها فعال است یا خیر و "__builtin_is_virtual_base_of" برای بررسی اینکه آیا کلاس پایه مجازی است یا خیر.
- حلقههای بینهایت بدیهی را بدون رفتار نامشخص پیادهسازی کرد.
- اطمینان حاصل شد که هنگام حذف یک اشارهگر به یک نوع ناقص، خطایی نمایش داده شود.
- نحو برای تعریف پارامترهای متغیر با بیضی بدون کامای قبلی (به عنوان مثال، هنگام تعیین "void e(int…)" به جای "void e(int,…)") منسوخ شده است.
- استفاده از ماکروها برای اعلام ماژول ها ممنوع است.
- تبدیل ضمنی مقادیر شمارشی در محاسبات حسابی منسوخ شده است. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // منسوخ شده int k = f - e; // منسوخ شده int x = +f - e; // تأیید شده }
- پشتیبانی از مقایسه مستقیم آرایهها متوقف شده است. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
- کلاس قالب is_trivial منسوخ شده است.
منبع: opennet.ru
