<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tech on kenji.blog</title><link>http://kenji.blog/ar/tags/tech/</link><description>Recent content in Tech on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 02:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/tech/index.xml" rel="self" type="application/rss+xml"/><item><title>【إصدار 2026】أهم الميزات الجديدة في C++26 ودليل الاستخدام العملي</title><link>http://kenji.blog/ar/p/cpp26-new-features-practical-guide/</link><pubDate>Sat, 12 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/cpp26-new-features-practical-guide/</guid><description>&lt;img src="http://kenji.blog/p/cpp26-new-features-practical-guide/img/eyecatch.jpg" alt="Featured image of post 【إصدار 2026】أهم الميزات الجديدة في C++26 ودليل الاستخدام العملي" />&lt;h1 id="مقدمة-نماذج-البرمجة-من-الجيل-التالي-التي-يقدمها-c26">مقدمة: نماذج البرمجة من الجيل التالي التي يقدمها C++26
&lt;/h1>&lt;p>في عام 2026، تم توحيد &lt;strong>C++26&lt;/strong> رسميًا، والذي يُعد معلمًا هامًا للغاية في تاريخ C++. منذ ظهور مفهوم &amp;ldquo;Modern C++&amp;rdquo; في C++11، تطورت اللغة بثبات عبر C++14 و C++17 و C++20 و C++23. لكن C++26 يُحدث نقلة نوعية قوية تقلب مفاهيم البرمجة الوصفية (Metaprogramming)، ومعالجة الأخطاء (Error handling)، والمعالجة المتزامنة (Concurrency) رأسًا على عقب، سواء من حيث ميزات اللغة أو المكتبة القياسية.&lt;/p>
&lt;p>في هذه المقالة، سنشرح بشكل شامل الميزات الجديدة الرئيسية التي تم إدخالها في C++26، والتفاصيل التقنية، وتحسينات الأداء في وقت الترجمة (Compile-time)، والمقارنة مع التعليمات البرمجية الحالية حتى C++23، بالإضافة إلى الاستخدامات العملية. وبحجم يتجاوز 10,000 حرف، سنغطي مجموعة واسعة من المواضيع، بما في ذلك الانعكاس (Reflection)، وبرمجة العقود (Contracts)، ومطابقة الأنماط (Pattern Matching)، وفهرسة الحزم (Pack Indexing)، وامتدادات الربط الهيكلي (Structured Bindings)، وتطور المكتبة القياسية مع التركيز على المرسلين/المستقبلين (Senders/Receivers).&lt;/p>
&lt;p>أولاً، دعونا نلقي نظرة مرئية على تاريخ توحيد C++ ومكانة C++26.&lt;/p>
&lt;div class="mermaid">timeline
title "تطور توحيد C++"
"C++11" : "بداية Modern C++" : "auto, lambda, constexpr, move semantics"
"C++14" : "تحسين الميزات" : "generic lambda, return type deduction"
"C++17" : "تحسين القابلية للاستخدام" : "std::optional, fold expressions, structured binding"
"C++20" : "نقلة نوعية" : "Concepts, Modules, Coroutines, Ranges"
"C++23" : "المزيد من التوسعات" : "Deducing this, std::expected, std::print"
"C++26" : "ثورة الجيل القادم" : "Reflection, Contracts, Pattern Matching"&lt;/div>
&lt;p>يهدف C++26 إلى زيادة &lt;strong>قدرة الكود على الوصف الذاتي (الانعكاس)&lt;/strong> و&lt;strong>المتانة (برمجة العقود)&lt;/strong> إلى أقصى حد، بناءً على الميزات واسعة النطاق مثل Concepts و Modules التي تم تقديمها في C++20. دعونا نتعمق في تفاصيل كل ميزة.&lt;/p>
&lt;hr>
&lt;h1 id="1-الانعكاس-الثابت-static-reflection-ثورة-حقيقية-في-البرمجة-الوصفية">1. الانعكاس الثابت (Static Reflection): ثورة حقيقية في البرمجة الوصفية
&lt;/h1>&lt;p>الميزة الأبرز في C++26 بلا شك هي &lt;strong>الانعكاس الثابت (Static Reflection)&lt;/strong> (بناءً على مقترحات مثل P2996). في السابق، للحصول على معلومات حول بنية النوع أو المتغيرات الأعضاء من داخل البرنامج في C++، كان لزامًا علينا استخدام برمجة القوالب الوصفية (TMP) المعقدة أو وحدات الماكرو. ومع ذلك، مع آلية الانعكاس في C++26، أصبح من الممكن الوصول إلى بنية البرنامج نفسه (AST: شجرة البنية المجردة) بشكل آمن وبديهي في وقت الترجمة.&lt;/p>
&lt;h2 id="11-تحديات-c23-وما-قبلها">1.1 تحديات C++23 وما قبلها
&lt;/h2>&lt;p>لنفترض أننا نريد تحويل جميع المتغيرات الأعضاء لهيكل معين إلى تسلسل JSON في C++23 وما قبلها. نظرًا لعدم وجود ميزة قياسية في اللغة لسرد أعضاء الهيكل، كان لزامًا علينا استخدام مكتبات خارجية مثل Boost.Describe و Boost.Pfr، أو تعريف وحدات ماكرو مخصصة لتسجيل الأعضاء.&lt;/p>
&lt;p>أدى ذلك إلى زيادة أوقات الترجمة وجعل رسائل الخطأ معقدة وغير مفهومة. من وجهة نظر رياضية، كانت عملية تحليل معلومات النوع السابقة التي تستخدم إنشاء مثيلات القوالب التكرارية تتطلب تعقيدًا حسابيًا في وقت الترجمة يبلغ $O(N)$ لعدد $N$ من العناصر، وفي الدوال الوصفية المعقدة، كان يتطلب إنشاء مثيلات أسوأ حالة $O(N^2)$.&lt;/p>
$$
T_{\text{compile}}(N) \approx O(N^2) \quad \text{(Recursive Template Metaprogramming)}
$$
&lt;h2 id="12-بناء-جملة-الانعكاس-والنهج-في-c26">1.2 بناء جملة الانعكاس والنهج في C++26
&lt;/h2>&lt;p>يستخدم الانعكاس في C++26 المعامل &lt;code>^&lt;/code> (معامل الانعكاس) وصيغة &lt;code>[: ... :]&lt;/code> (مقسم). يتم الحصول على &amp;ldquo;المعلومات الوصفية&amp;rdquo; للنوع أو المتغير بواسطة &lt;code>^T&lt;/code>، ويتم التعامل معها ككائن ثابت في وقت الترجمة من النوع &lt;code>std::meta::info&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;meta&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">User&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">email&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// مُسلسل (Serializer) عام باستخدام الانعكاس الثابت في C++26
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="k">typename&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="n">print_json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">obj&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">constexpr&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="n">type_info&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">^&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;{&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// الحصول على معلومات العضو للهيكل والتكرار عبرها
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">template&lt;/span> &lt;span class="nf">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">constexpr&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="nl">member&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">meta&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">nonstatic_data_members_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">type_info&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// فك الرمز الأصلي باستخدام [: member :]، والحصول على المعرف (الاسم) كسلسلة
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">meta&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">identifier_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">member&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">: &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">obj&lt;/span>&lt;span class="p">.[&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nl">member&lt;/span>&lt;span class="p">:]&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;,&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;}&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">User&lt;/span> &lt;span class="n">u&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Alice&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;alice@example.com&amp;#34;&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">print_json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">u&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>في هذا الكود، يتم استخدام &lt;code>template for&lt;/code> (توسيع الحلقة في وقت الترجمة) لسرد كافة أعضاء الهيكل &lt;code>User&lt;/code>.&lt;/p>
&lt;h2 id="13-الأداء-وتعقيد-وقت-الترجمة">1.3 الأداء وتعقيد وقت الترجمة
&lt;/h2>&lt;p>أكبر فائدة لهذه الميزة الجديدة هي &lt;strong>تقليل وقت الترجمة&lt;/strong>. نظرًا لأنه يتم معالجة المعلومات الوصفية بشكل مباشر داخل المترجم، تتم معالجة الوصول إلى العناصر والتكرار بعبء إضافي يبلغ $O(1)$. نظرًا لأنه يتم تقييمه فورًا كتعبير ثابت، يتحسن تعقيد وقت الترجمة بشكل جذري.&lt;/p>
$$
T_{\text{compile\_new}}(N) = O(N) \quad \text{(Direct AST Traversal)}
$$
&lt;p>ستتخلص من مشكلات استنفاد ذاكرة المترجم بسبب تداخل القوالب، ورسائل الخطأ الطويلة (بحر من أخطاء القوالب).&lt;/p>
&lt;div class="mermaid">graph TD
A["النوع: User"] -->| "^User" | B["std::meta::info"]
B -->| "nonstatic_data_members_of" | C["نطاق meta::info"]
C -->| "[: member :]" | D["وصول مباشر للعضو (obj.id, obj.name)"]
D --> E["الكود المولد (بدون عبء إضافي)"]&lt;/div>
&lt;hr>
&lt;h1 id="2-برمجة-العقود-contracts-تصميم-برمجي-متين">2. برمجة العقود (Contracts): تصميم برمجي متين
&lt;/h1>&lt;p>بعد أن تم تأجيل إضافتها في C++20، تم أخيرًا تقديم ميزة &lt;strong>العقود (Contracts)&lt;/strong> التي طالما تمت مناقشتها في C++26 (مثل مقترح P2900). تدعم الآن اللغة بشكل مدمج نموذج &amp;ldquo;التصميم بالعقد&amp;rdquo; (Design by Contract)، مما يسمح بتعريف الشروط المسبقة للدالة (Pre-condition)، والشروط اللاحقة (Post-condition)، والتأكيدات (Assertion) بطريقة تصريحية.&lt;/p>
&lt;h2 id="21-البنية-الأساسية-للعقود">2.1 البنية الأساسية للعقود
&lt;/h2>&lt;p>في C++26، يتم إرفاق سمات العقد بتصريحات الدالة.&lt;/p>
&lt;ul>
&lt;li>&lt;code>pre&lt;/code> : شرط يجب استيفاؤه قبل استدعاء الدالة.&lt;/li>
&lt;li>&lt;code>post&lt;/code> : شرط يجب استيفاؤه عند انتهاء الدالة وإرجاع قيمة.&lt;/li>
&lt;li>&lt;code>assert&lt;/code> : شرط يجب استيفاؤه عند نقطة معينة داخل الدالة.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;numeric&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// حساب آمن للمتوسط باستخدام برمجة العقود
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// شرط مسبق: لا ينبغي أن يكون المتجه المُمرر فارغاً
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// شرط لاحق: القيمة المتوسطة المحسوبة يجب أن تكون أكبر من أو تساوي القيمة الصغرى وأقل من أو تساوي القيمة الكبرى في المتجه
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">double&lt;/span> &lt;span class="nf">calculate_average&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">double&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pre&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">post&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nl">r&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">min_element&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">end&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">max_element&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">end&lt;/span>&lt;span class="p">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">double&lt;/span> &lt;span class="n">sum&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">accumulate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">end&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="mf">0.0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">double&lt;/span> &lt;span class="n">avg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sum&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// تأكيد أثناء المعالجة
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">assert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">avg&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">avg&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// التحقق من NaN وغيرها
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">avg&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// يرتبط بالمتغير &amp;#39;r&amp;#39; في الشرط اللاحق
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="22-معالجة-انتهاكات-العقد-والتقييم-في-وقت-التشغيل">2.2 معالجة انتهاكات العقد والتقييم في وقت التشغيل
&lt;/h2>&lt;p>العقود ليست مجرد تعليقات أو ماكرو &lt;code>assert()&lt;/code> القديم. بناءً على وضع البناء (بناء التطوير، بناء الإنتاج، إلخ)، يمكنك إرشاد المترجم بخصوص &lt;strong>السلوك عند حدوث انتهاك&lt;/strong>. على سبيل المثال، أثناء التطوير، يمكن إجبار البرنامج على التوقف الفوري (abort) عند الانتهاك، بينما في بيئة الإنتاج، يمكن استدعاء معالج انتهاكات مخصص لتسجيل الخطأ والاستمرار بمرونة.&lt;/p>
&lt;div class="mermaid">graph TD
A["استدعاء الدالة"] --> B{"تقييم الشرط المسبق"}
B -- "صحيح" --> C["تنفيذ جسم الدالة"]
B -- "خطأ" --> D["استدعاء معالج الانتهاكات"]
D --> E["تسجيل الخطأ / التوقف / إلقاء استثناء"]
C --> F{"تقييم الشرط اللاحق"}
F -- "صحيح" --> G["إرجاع القيمة"]
F -- "خطأ" --> D&lt;/div>
&lt;p>باستخدام العقود، لا يتم توثيق مواصفات واجهة برمجة التطبيقات (API) ذاتيًا فحسب، بل يمكن إيقاف البرنامج والتحكم فيه بأمان قبل التسبب في سلوك غير محدد (UB). لذا يُتوقع تقليل أخطاء تلف الذاكرة والأخطاء المنطقية الخاصة بلغة C++ بشكل كبير.&lt;/p>
&lt;hr>
&lt;h1 id="3-مطابقة-الأنماط-pattern-matching-تحسين-التفريغ">3. مطابقة الأنماط (Pattern Matching): تحسين التفريغ
&lt;/h1>&lt;p>منذ تقديم &lt;code>std::variant&lt;/code> و &lt;code>std::any&lt;/code> في C++17، تم استخدام &lt;code>std::visit&lt;/code> لتوزيع المتغيرات التي تحمل أنواعًا مختلفة. ومع ذلك، كان الجمع بين &lt;code>std::visit&lt;/code> ونمط التحميل الزائد (ما يسمى باختراق الهيكل &lt;code>overloaded&lt;/code>) مطولًا للغاية وصعب القراءة.&lt;/p>
&lt;p>في C++26، تم دمج &lt;strong>مطابقة الأنماط (Pattern Matching)&lt;/strong> كميزة لغوية (متوافق مع P2688). يتيح ذلك مطابقة بديهية مشابهة للغات الوظيفية (مثل Rust و Haskell).&lt;/p>
&lt;h2 id="31-معاناة-stdvisit-حتى-c23">3.1 معاناة &lt;code>std::visit&lt;/code> حتى C++23
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// كتابة الأكواد حتى C++23
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="k">class&lt;/span>&lt;span class="err">... &lt;/span>&lt;span class="nc">Ts&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="nc">overloaded&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">Ts&lt;/span>&lt;span class="p">...&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">using&lt;/span> &lt;span class="n">Ts&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="k">operator&lt;/span>&lt;span class="p">()...;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">template&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="k">class&lt;/span>&lt;span class="err">... &lt;/span>&lt;span class="nc">Ts&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">overloaded&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Ts&lt;/span>&lt;span class="p">...)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">overloaded&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Ts&lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">variant&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">double&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Hello&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">visit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">overloaded&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[](&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Int: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[](&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;String: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[](&lt;/span>&lt;span class="kt">double&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Double: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">},&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="32-تحسن-جذري-بواسطة-البنية-inspect-في-c26">3.2 تحسن جذري بواسطة البنية &lt;code>inspect&lt;/code> في C++26
&lt;/h2>&lt;p>باستخدام الكلمة الأساسية الجديدة &lt;code>inspect&lt;/code>، يصبح من الممكن كتابة الكود بشكل أكثر ترتيبًا كما يلي:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// مطابقة الأنماط في C++26
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">variant&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">double&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Hello&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">inspect&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Int: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;String: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">double&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Double: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Unknown type&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// حرف بدل (Wildcard)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>لا تقتصر مطابقة الأنماط هذه على توزيع الأنواع فحسب، بل تدعم أيضًا &lt;strong>التفكيك الهيكلي (Destructuring)&lt;/strong> للهياكل و&lt;strong>شروط الحماية (Guard conditions)&lt;/strong> (يتم المطابقة فقط إذا تم استيفاء شرط معين).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Point&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">variant&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Point&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">var&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">inspect&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">var&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ربط عناصر الهيكل مع إضافة شرط حماية (if)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">as&lt;/span> &lt;span class="n">Point&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Diagonal: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">as&lt;/span> &lt;span class="n">Point&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Point: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;, &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Scalar: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>يقوم المترجم بإجراء فحص الشمولية (Exhaustiveness checking) لبيان &lt;code>inspect&lt;/code> هذا، لذا سيتم الإبلاغ عن خطأ في الترجمة إذا كان هناك أي حالات مفقودة في معالجة النوع &lt;code>enum&lt;/code> أو &lt;code>std::variant&lt;/code>. هذا أمر بالغ الأهمية لتحسين قابلية الصيانة.&lt;/p>
&lt;hr>
&lt;h1 id="4-فهرسة-الحزم-pack-indexing-إنقاذ-حزم-وسائط-القوالب">4. فهرسة الحزم (Pack Indexing): إنقاذ حزم وسائط القوالب
&lt;/h1>&lt;p>القوالب متغيرة الطول (Variadic Templates) المتوفرة منذ C++11 قوية للغاية، ولكن عملية استخراج النوع أو القيمة ذات الرقم $N$ من حزمة الوسائط لم تكن بديهية. في السابق، كان لزامًا علينا استخدام &lt;code>std::tuple_element&lt;/code> أو القوالب التكرارية لاستخراجها.&lt;/p>
&lt;p>في C++26، تم تقديم ميزة &lt;strong>Pack Indexing&lt;/strong> (الفهرسة للحزم) (P2662)، مما يسمح بالكتابة بشكل أكثر طبيعية يشبه الوصول إلى فهرس المصفوفات.&lt;/p>
&lt;h2 id="41-أساسيات-فهرسة-الحزم">4.1 أساسيات فهرسة الحزم
&lt;/h2>&lt;p>بناء الجملة بسيط للغاية، حيث يتم كتابته كالتالي: &lt;code>Types...[I]&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;type_traits&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// دالة لاستخراج النوع ذي الرقم N
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">size_t&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">typename&lt;/span>&lt;span class="p">...&lt;/span> &lt;span class="n">Types&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">constexpr&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="n">get_nth_type&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// الوصول المباشر للنوع رقم N باستخدام Types...[N]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">Types&lt;/span>&lt;span class="p">...[&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="p">]{};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// دالة لاستخراج القيمة ذات الرقم N من الوسائط متغيرة الطول
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">size_t&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">typename&lt;/span>&lt;span class="p">...&lt;/span> &lt;span class="n">Args&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">constexpr&lt;/span> &lt;span class="k">decltype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">auto&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">get_nth_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Args&lt;/span>&lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="p">...&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// الوصول للفهرس متاح أيضًا لحزمة الوسائط args
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">forward&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Args&lt;/span>&lt;span class="p">...[&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">...[&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// الوصول إلى الأنواع
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">using&lt;/span> &lt;span class="n">SecondType&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">decltype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">get_nth_type&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">double&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static_assert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">is_same_v&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">SecondType&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">double&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// الوصول إلى القيم
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_nth_value&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.14&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Hello C++26&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sc">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// سيطبع &amp;#34;Hello C++26&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>يمكن للمترجم الآن معالجة فهرس الحزمة في وقت ثابت $O(1)$، مما يقلل من وقت الترجمة الطويل الذي كان يسببه تداخل الدوال الوصفية.&lt;/p>
&lt;hr>
&lt;h1 id="5-امتداد-الربط-الهيكلي-structured-bindings">5. امتداد الربط الهيكلي (Structured Bindings)
&lt;/h1>&lt;p>يعتبر الربط الهيكلي المُقدم في C++17 مفيدًا للغاية عند تلقي قيم الإرجاع المتعددة من الدالة، ولكن إذا كنت ترغب في استخدام بعض المتغيرات وتجاهل الأخرى، كان عليك تعريف متغير وهمي، وكان تجنب تحذير &amp;ldquo;المتغير غير المستخدم&amp;rdquo; (unused variable) يتطلب مجهودًا إضافيًا.&lt;/p>
&lt;p>في C++26، سُمح رسميًا باستخدام &lt;code>_&lt;/code> (الشرطة السفلية) كعنصر نائب (Placeholder).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;map&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">get_data&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">{{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;One&amp;#34;&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Two&amp;#34;&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Three&amp;#34;&lt;/span>&lt;span class="p">}};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_data&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="k">auto&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// تجاهل القيمة (السلسلة) واستخدام المفتاح (المعرف) فقط
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;ID: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">id&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sc">&amp;#39;\n&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بفضل هذا الامتداد الصغير، تصبح نية الكود أكثر وضوحًا، مما يمنع الاستخدام المفرط لتوجيهات &lt;code>#pragma&lt;/code> أو سمات &lt;code>[[maybe_unused]]&lt;/code> لمنع التحذيرات غير الضرورية.&lt;/p>
&lt;hr>
&lt;h1 id="6-تطور-المكتبة-القياسية-إعادة-تعريف-المعالجة-المتزامنة-وغير-المتزامنة">6. تطور المكتبة القياسية: إعادة تعريف المعالجة المتزامنة وغير المتزامنة
&lt;/h1>&lt;p>إلى جانب ميزات اللغة، شهدت المكتبة القياسية لـ C++ (STL) تطورًا هائلاً في C++26. وخاصة في مجالات المعالجة غير المتزامنة وإدارة الذاكرة، تم تقديم مكونات متقدمة لتلبية متطلبات الشركات وبرمجة الأنظمة.&lt;/p>
&lt;h2 id="61-المرسلين--المستقبلين-senders--receivers-عبر-stdexecution">6.1 المرسلين / المستقبلين (Senders / Receivers) عبر (std::execution)
&lt;/h2>&lt;p>لقد توج مقترح التوحيد القياسي (P2300)، الذي يعيد بناء نموذج المعالجة غير المتزامنة في C++ من الأساس، بالنجاح في C++26. لحل مشكلات الأداء (تخصيص الذاكرة المفرط وعدم كفاءة الجدولة) التي كانت تعاني منها &lt;code>std::async&lt;/code> و &lt;code>std::future&lt;/code>، تم إدخال نموذج &lt;strong>Senders/Receivers&lt;/strong>.&lt;/p>
&lt;div class="mermaid">graph LR
S["المرسل (وصف المهمة)"] -->|connect| O["حالة العملية"]
O -->|start| E["التنفيذ (تجمع الخيوط، وحدة معالجة الرسومات، إلخ)"]
E -->|set_value / set_error / set_stopped| R["المستقبل (دالة الاستدعاء)"]&lt;/div>
&lt;p>المرسلين (Senders) عبارة عن مخطط خفيف الوزن يصف &amp;ldquo;ما يجب القيام به&amp;rdquo;، وهو منفصل عن سياق التنفيذ (الجدولة). هذا يسمح بوصف تفريغ المهام إلى تجمع الخيوط (ThreadPool) الخاص بوحدة المعالجة المركزية أو وحدة معالجة الرسومات بكفاءة عبر واجهة موحدة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;execution&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;syncstream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">execution&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">scheduler&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_system_thread_pool&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="n">scheduler&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// مسار معالجة المهام (لا يُنفذ في هذه المرحلة: تقييم مؤجل)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="n">task&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">schedule&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">scheduler&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">|&lt;/span> &lt;span class="n">then&lt;/span>&lt;span class="p">([]&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="mi">42&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">|&lt;/span> &lt;span class="n">then&lt;/span>&lt;span class="p">([](&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">|&lt;/span> &lt;span class="n">upon_error&lt;/span>&lt;span class="p">([](&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">exception_ptr&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// انتظار النتيجة بشكل متزامن باستخدام sync_wait
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sync_wait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">task&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">osyncstream&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Result: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="62-مؤشرات-الخطر-hazard-pointers-و-rcu-التحديث-بالنسخ-عند-القراءة">6.2 مؤشرات الخطر (Hazard Pointers) و RCU (التحديث بالنسخ عند القراءة)
&lt;/h2>&lt;p>كميزات قياسية تدعم تنفيذ هياكل البيانات الخالية من الأقفال (Lock-free)، تم توحيد &lt;strong>مؤشرات الخطر (Hazard Pointers)&lt;/strong> (&lt;code>std::hazard_pointer&lt;/code>) و &lt;strong>RCU&lt;/strong> (&lt;code>std::rcu&lt;/code>). وقد أدى ذلك إلى خفض كبير في العقبات المتمثلة في تنفيذ هياكل بيانات متزامنة وعالية الأداء في C++.&lt;/p>
&lt;p>يتيح نظام RCU (التحديث بالنسخ عند القراءة) خصوصًا في أعباء العمل التي تكثر فيها القراءات، التخلص من تعارض خط التخزين المؤقت، وتحقيق قابلية التوسع الخطي. وبصيغة رياضية، بالنسبة لعدد الخيوط $T$، تُظهر إنتاجية القراءة زيادة مثالية تبلغ $O(T)$.&lt;/p>
$$
\text{Throughput}_{\text{RCU}} \propto T \quad \text{(Read-heavy Workloads)}
$$
&lt;hr>
&lt;h1 id="7-دليل-الانتقال-العملي-وفوائد-الاعتماد">7. دليل الانتقال العملي وفوائد الاعتماد
&lt;/h1>&lt;p>يتطلب الانتقال إلى C++26 نقلة نوعية ضخمة مشابهة لتلك التي حدثت مع C++11، ولكنه يجلب معه فوائد تحسين سلامة الشيفرة ووقت الترجمة بشكل ملحوظ.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>تجديد البرمجة الوصفية&lt;/strong>: يمكن إعادة كتابة مكتبات التسلسل أو أطر عمل ORM (التي تعتمد على الربط الكائني العلائقي) المكونة من تداخلات &lt;code>template&lt;/code> أو &lt;code>constexpr if&lt;/code> المعقدة باستخدام ميزة الانعكاس في C++26، مما سيؤدي إلى تحسين قابلية الصيانة بشكل هائل، ومن المحتمل أن يقلل وقت الترجمة إلى كسر من الوقت السابق.&lt;/li>
&lt;li>&lt;strong>تصميم واجهة برمجة التطبيقات (API) بواسطة العقود&lt;/strong>: يجب على مصممي مكتبات الفئات استخدام العقود (&lt;code>pre&lt;/code> / &lt;code>post&lt;/code>) لتوضيح المواصفات على مستوى اللغة بدلاً من الاعتماد على تعليقات التوثيق مثل Doxygen. يتيح ذلك الاكتشاف المبكر للاستدعاءات غير الصالحة من جانب المستخدم.&lt;/li>
&lt;li>&lt;strong>تحديث المعالجة غير المتزامنة&lt;/strong>: من خلال نقل المعالجة غير المتزامنة التي كانت تعتمد على التنفيذ المستقل أو Boost.Asio إلى &lt;code>std::execution&lt;/code> (المرسلين/المستقبلين)، يمكنك بناء بنية معالجة متزامنة قياسية عبر منصات وأجهزة مختلفة.&lt;/li>
&lt;/ol>
&lt;h2 id="ملاحظات-عند-الانتقال-استقرار-واجهة-التطبيق-الثنائية-abi-ودعم-المترجم">ملاحظات عند الانتقال: استقرار واجهة التطبيق الثنائية (ABI) ودعم المترجم
&lt;/h2>&lt;p>نظرًا لأن ميزات اللغة الجديدة، وخاصة العقود، يمكن أن تؤثر على توقيعات الدوال و ABI (واجهة التطبيق الثنائية)، يجب التأكد تمامًا عند استخدامها عبر حدود المكتبات المشتركة (DLL / .so) أنها مترجمة بنفس المترجم وإصدار المكتبة القياسية (GCC, Clang, MSVC).&lt;/p>
&lt;hr>
&lt;h1 id="الخلاصة">الخلاصة
&lt;/h1>&lt;p>يعتبر C++26 إصدارًا تاريخيًا بكل معنى الكلمة، حيث جلب دفعة واحدة &amp;ldquo;ميزات الأحلام&amp;rdquo; التي كان ينتظرها مبرمجو C++ منذ فترة طويلة.&lt;/p>
&lt;ul>
&lt;li>بفضل &lt;strong>الانعكاس (Reflection)&lt;/strong>، تمت إزالة صعوبة البرمجة الوصفية وتم تحقيق وصول AST بوقت $O(1)$.&lt;/li>
&lt;li>بفضل &lt;strong>برمجة العقود (Contracts)&lt;/strong>، أصبح من الممكن تحديد الشروط المسبقة واللاحقة للدالة بوضوح، وبناء برامج متينة.&lt;/li>
&lt;li>بفضل &lt;strong>مطابقة الأنماط (Pattern Matching)&lt;/strong>، أمكن كتابة التفرعات والانتقالات الحالية المعقدة بشكل بديهي وآمن.&lt;/li>
&lt;li>بفضل &lt;strong>المرسلين/المستقبلين (Senders/Receivers)&lt;/strong> و &lt;strong>RCU / مؤشرات الخطر (Hazard Pointers)&lt;/strong>، تم توحيد المعالجة المتزامنة التي تستخرج أقصى درجات الأداء.&lt;/li>
&lt;/ul>
&lt;p>من خلال الاستفادة السليمة من هذه الميزات، سيصبح من الممكن تحقيق أكبر قوة لـ C++، وهي &amp;ldquo;التجريد بدون تكلفة إضافية (Zero-overhead Abstraction)&amp;rdquo; على مستوى أعلى بكثير، وبتعليمات برمجية نظيفة بشكل مدهش.&lt;/p>
&lt;p>المُضي قُدُماً، ونحن نراقب حالة تنفيذ ميزات C++26 بواسطة بائعي المترجمات المختلفة (مثل وحدات ماكرو اختبار الميزات)، نوصي بدمج هذه النماذج الجديدة بفعالية في المشاريع الجديدة وتطوير المكتبات. لم تكن C++ أبدًا لغة قديمة؛ بل من المؤكد أنها ستستمر في التربع على قمة برمجة الأنظمة بينما تستوعب بنهم أحدث النظريات اللغوية.&lt;/p>
&lt;hr>
&lt;p>&lt;em>كُتب هذا المقال استنادًا إلى حالة التوحيد القياسي لـ C++26 اعتبارًا من عام 2026. يرجى ملاحظة أن بعض بنى الجمل قد تتغير اعتمادًا على حالة تنفيذ كل مترجم.&lt;/em>&lt;/p></description></item></channel></rss>