<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C++26 on kenji.blog</title><link>http://kenji.blog/fr/tags/c++26/</link><description>Recent content in C++26 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 02:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/c++26/index.xml" rel="self" type="application/rss+xml"/><item><title>【Édition 2026】Les principales nouveautés de C++26 et leur utilisation pratique</title><link>http://kenji.blog/fr/p/cpp26-new-features-practical-guide/</link><pubDate>Sat, 12 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/fr/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 【Édition 2026】Les principales nouveautés de C++26 et leur utilisation pratique" />&lt;h1 id="introduction--le-paradigme-de-programmation-de-la-prochaine-génération-apporté-par-c26">Introduction : Le paradigme de programmation de la prochaine génération apporté par C++26
&lt;/h1>&lt;p>En 2026, &lt;strong>C++26&lt;/strong>, une étape extrêmement importante dans l&amp;rsquo;histoire de C++, a été officiellement standardisée. Depuis l&amp;rsquo;émergence du concept de &amp;ldquo;Modern C++&amp;rdquo; avec C++11, le langage a évolué de manière constante avec C++14, C++17, C++20 et C++23. Cependant, C++26 apporte un changement de paradigme puissant qui bouleverse le sens commun en matière de métaprogrammation, de gestion des erreurs et de traitement concurrent, tant au niveau des fonctionnalités du langage que de la bibliothèque standard.&lt;/p>
&lt;p>Cet article explique en détail les principales nouveautés introduites par C++26 : les détails techniques, l&amp;rsquo;amélioration des performances à la compilation, la comparaison avec le code existant jusqu&amp;rsquo;à C++23, et leur utilisation pratique. Avec un volume dépassant les 10 000 caractères, il couvre un large éventail de sujets, allant de la réflexion (Reflection) à la programmation par contrat (Contracts), au filtrage par motif (Pattern Matching), à l&amp;rsquo;indexation de packs (Pack Indexing) et à l&amp;rsquo;extension des liaisons structurées (Structured Bindings), jusqu&amp;rsquo;à l&amp;rsquo;évolution de la bibliothèque standard incluant les Senders/Receivers.&lt;/p>
&lt;p>Commençons par examiner visuellement l&amp;rsquo;historique de la standardisation de C++ et le positionnement de C++26.&lt;/p>
&lt;div class="mermaid">timeline
title "Évolution de la standardisation de C++"
"C++11" : "L'aube du C++ Moderne" : "auto, lambda, constexpr, move semantics"
"C++14" : "Raffinement des fonctionnalités" : "generic lambda, return type deduction"
"C++17" : "Amélioration de l'utilisabilité" : "std::optional, fold expressions, structured binding"
"C++20" : "Changement de paradigme" : "Concepts, Modules, Coroutines, Ranges"
"C++23" : "Extensions supplémentaires" : "Deducing this, std::expected, std::print"
"C++26" : "La révolution de la prochaine génération" : "Reflection, Contracts, Pattern Matching"&lt;/div>
&lt;p>C++26 s&amp;rsquo;appuie sur des groupes de fonctionnalités majeurs tels que les Concepts et les Modules, introduits dans C++20, et vise à maximiser &lt;strong>l&amp;rsquo;auto-description du code (réflexion)&lt;/strong> et &lt;strong>la robustesse (programmation par contrat)&lt;/strong>. Plongeons maintenant dans les détails de chaque fonctionnalité.&lt;/p>
&lt;hr>
&lt;h1 id="1-réflexion-static-reflection--la-véritable-révolution-de-la-métaprogrammation">1. Réflexion (Static Reflection) : La véritable révolution de la métaprogrammation
&lt;/h1>&lt;p>Il n&amp;rsquo;est pas exagéré de dire que la fonctionnalité phare de C++26 est la &lt;strong>réflexion statique (Static Reflection)&lt;/strong> (principalement basée sur des propositions comme P2996). Jusqu&amp;rsquo;à présent en C++, pour obtenir des informations sur la structure d&amp;rsquo;un type ou de ses variables membres depuis le programme, il était nécessaire d&amp;rsquo;utiliser une métaprogrammation par templates (TMP) complexe ou des macros. Cependant, grâce au mécanisme de réflexion de C++26, il est désormais possible d&amp;rsquo;accéder de manière sûre et intuitive à la structure même du programme (les informations de l&amp;rsquo;AST : arbre syntaxique abstrait) au moment de la compilation.&lt;/p>
&lt;h2 id="11-les-défis-jusquà-c23">1.1 Les défis jusqu&amp;rsquo;à C++23
&lt;/h2>&lt;p>Considérons le cas où, avant C++23, nous voulions sérialiser toutes les variables membres d&amp;rsquo;une structure en JSON. Comme il n&amp;rsquo;existait aucun moyen standard d&amp;rsquo;énumérer les membres d&amp;rsquo;une structure au niveau du langage, il fallait soit utiliser des bibliothèques tierces comme Boost.Describe ou Boost.Pfr, soit définir ses propres macros pour enregistrer les membres.&lt;/p>
&lt;p>Cela entraînait une augmentation du temps de compilation et rendait les messages d&amp;rsquo;erreur très difficiles à comprendre. D&amp;rsquo;un point de vue mathématique, l&amp;rsquo;analyse des informations de type à l&amp;rsquo;aide de l&amp;rsquo;instanciation de modèles récursifs nécessitait une complexité de compilation de $O(N)$ pour $N$ éléments, et dans le pire des cas, $O(N^2)$ instanciations pour des métafonctions complexes.&lt;/p>
$$
T_{\text{compile}}(N) \approx O(N^2) \quad \text{(Recursive Template Metaprogramming)}
$$
&lt;h2 id="12-syntaxe-et-approche-de-la-réflexion-en-c26">1.2 Syntaxe et approche de la réflexion en C++26
&lt;/h2>&lt;p>La réflexion en C++26 utilise l&amp;rsquo;opérateur &lt;code>^&lt;/code> (opérateur de réflexion) et la syntaxe &lt;code>[: ... :]&lt;/code> (splicer). &lt;code>^T&lt;/code> permet de récupérer les &amp;ldquo;méta-informations&amp;rdquo; d&amp;rsquo;un type ou d&amp;rsquo;une variable, et celles-ci sont manipulées comme des objets constants à la compilation de type &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;/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">// Sérialiseur générique utilisant la réflexion statique de 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">// Récupérer et itérer sur les informations des membres de la structure
&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">// Déplier dans le symbole d&amp;#39;origine avec [: member :] et récupérer l&amp;#39;identifiant (nom) sous forme de chaîne
&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;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dans ce code, on utilise &lt;code>template for&lt;/code> (déploiement de boucle à la compilation) pour énumérer tous les membres de la structure &lt;code>User&lt;/code>.&lt;/p>
&lt;h2 id="13-performances-et-complexité-à-la-compilation">1.3 Performances et complexité à la compilation
&lt;/h2>&lt;p>Le plus grand avantage de cette nouvelle fonctionnalité est &lt;strong>la réduction du temps de compilation&lt;/strong>. Étant donné que le compilateur manipule directement les méta-informations en interne, l&amp;rsquo;accès aux éléments et l&amp;rsquo;itération sont traités avec un surcoût de $O(1)$. Comme cela est évalué immédiatement en tant qu&amp;rsquo;expression constante, la complexité du temps de compilation est considérablement améliorée.&lt;/p>
$$
T_{\text{compile\_new}}(N) = O(N) \quad \text{(Direct AST Traversal)}
$$
&lt;p>Vous n&amp;rsquo;aurez plus affaire à l&amp;rsquo;épuisement de la mémoire du compilateur dû à l&amp;rsquo;imbrication de modèles, ni aux messages d&amp;rsquo;erreur interminables (la mer d&amp;rsquo;erreurs de modèles).&lt;/p>
&lt;div class="mermaid">graph TD
A["Type: User"] -->| "^User" | B["std::meta::info"]
B -->| "nonstatic_data_members_of" | C["Plage de meta::info"]
C -->| "[: member :]" | D["Accès direct aux membres (obj.id, obj.name)"]
D --> E["Code généré (Zéro surcoût)"]&lt;/div>
&lt;hr>
&lt;h1 id="2-programmation-par-contrat-contracts--conception-logicielle-robuste">2. Programmation par contrat (Contracts) : Conception logicielle robuste
&lt;/h1>&lt;p>Reportés depuis C++20 et discutés depuis longtemps, les &lt;strong>Contracts (Programmation par contrat)&lt;/strong> ont finalement été introduits dans C++26 (P2900 etc.). Le paradigme du &amp;ldquo;Design by Contract&amp;rdquo; est désormais pris en charge de manière intégrée au langage, ce qui permet de décrire de manière déclarative les préconditions (Pre-condition), les postconditions (Post-condition) et les assertions (Assertion) d&amp;rsquo;une fonction.&lt;/p>
&lt;h2 id="21-syntaxe-de-base-des-contrats">2.1 Syntaxe de base des contrats
&lt;/h2>&lt;p>En C++26, des attributs de contrat sont appliqués aux déclarations de fonctions.&lt;/p>
&lt;ul>
&lt;li>&lt;code>pre&lt;/code> : Condition qui doit être remplie avant l&amp;rsquo;appel de la fonction.&lt;/li>
&lt;li>&lt;code>post&lt;/code> : Condition qui doit être remplie lorsque la fonction se termine et renvoie une valeur.&lt;/li>
&lt;li>&lt;code>assert&lt;/code> : Condition qui doit être remplie à un point spécifique à l&amp;rsquo;intérieur de la fonction.&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">// Calcul sécurisé d&amp;#39;une moyenne via la programmation par contrat
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Précondition : le vecteur passé ne doit pas être vide
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Postcondition : la moyenne calculée est supérieure ou égale à la valeur minimale du vecteur et inférieure ou égale à sa valeur maximale
&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">// Assertion en cours de traitement
&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">// Vérification de NaN etc.
&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">// Lié à la variable &amp;#39;r&amp;#39; de la postcondition
&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-gestion-des-violations-de-contrat-et-évaluation-à-lexécution">2.2 Gestion des violations de contrat et évaluation à l&amp;rsquo;exécution
&lt;/h2>&lt;p>Les contrats diffèrent de simples commentaires ou de l&amp;rsquo;ancienne macro &lt;code>assert()&lt;/code>. Selon le mode de compilation (développement, production, etc.), vous pouvez indiquer au compilateur le &lt;strong>comportement à adopter en cas de violation&lt;/strong>. Par exemple, vous pouvez provoquer un plantage (abandon) immédiat lors d&amp;rsquo;une violation en développement, ou appeler un gestionnaire de violation personnalisé dans l&amp;rsquo;environnement de production pour enregistrer un journal et continuer, offrant ainsi une exploitation très flexible.&lt;/p>
&lt;div class="mermaid">graph TD
A["Fonction appelée"] --> B{"Évaluation de la précondition"}
B -- "Vrai" --> C["Exécuter le corps de la fonction"]
B -- "Faux" --> D["Invoquer le gestionnaire de violation"]
D --> E["Enregistrer l'erreur / Interrompre / Lancer l'exception"]
C --> F{"Évaluation de la postcondition"}
F -- "Vrai" --> G["Valeur de retour"]
F -- "Faux" --> D&lt;/div>
&lt;p>L&amp;rsquo;utilisation des contrats non seulement auto-documente les spécifications de l&amp;rsquo;API, mais permet également d&amp;rsquo;arrêter et de contrôler le programme en toute sécurité avant de provoquer un comportement non défini (UB), ce qui laisse présager une réduction drastique des bugs de destruction de mémoire et de logique propres à C++.&lt;/p>
&lt;hr>
&lt;h1 id="3-filtrage-par-motif-pattern-matching--le-raffinement-des-branchements">3. Filtrage par motif (Pattern Matching) : Le raffinement des branchements
&lt;/h1>&lt;p>Depuis l&amp;rsquo;introduction de &lt;code>std::variant&lt;/code> et &lt;code>std::any&lt;/code> en C++17, &lt;code>std::visit&lt;/code> a été utilisé pour distribuer les variables contenant différents types. Cependant, la combinaison de &lt;code>std::visit&lt;/code> et du motif de surcharge (le fameux hack de la structure &lt;code>overloaded&lt;/code>) était extrêmement verbeuse et peu lisible.&lt;/p>
&lt;p>Dans C++26, le &lt;strong>filtrage par motif (Pattern Matching)&lt;/strong> a été intégré en tant que fonctionnalité du langage (conforme à P2688). Cela permet un appariement intuitif, proche de celui des langages fonctionnels (comme Rust ou Haskell).&lt;/p>
&lt;h2 id="31-les-difficultés-avec-stdvisit-jusquà-c23">3.1 Les difficultés avec &lt;code>std::visit&lt;/code> jusqu&amp;rsquo;à 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">// Écriture jusqu&amp;#39;à 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-lamélioration-spectaculaire-via-la-syntaxe-inspect-de-c26">3.2 L&amp;rsquo;amélioration spectaculaire via la syntaxe &lt;code>inspect&lt;/code> de C++26
&lt;/h2>&lt;p>Grâce au nouveau mot-clé &lt;code>inspect&lt;/code>, il est possible d&amp;rsquo;écrire le code de manière beaucoup plus claire.&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">// Filtrage par motif en 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;Type inconnu&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">// Caractère générique (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>Ce filtrage par motif ne se limite pas à la simple distribution des types, mais supporte également la &lt;strong>déstructuration de structures&lt;/strong> (décomposition) et les &lt;strong>conditions de garde&lt;/strong> (ne correspond que si une condition spécifique est remplie).&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">// Lier les éléments de la structure tout en ajoutant une condition de garde (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>Le compilateur effectue une vérification d&amp;rsquo;exhaustivité (Exhaustiveness checking) sur cette instruction &lt;code>inspect&lt;/code>, de sorte que s&amp;rsquo;il y a un cas manquant dans le traitement des énumérations (enum) ou de &lt;code>std::variant&lt;/code>, il sera signalé comme erreur de compilation. Ceci est extrêmement important pour améliorer la maintenabilité.&lt;/p>
&lt;hr>
&lt;h1 id="4-indexation-de-packs-pack-indexing--le-salut-pour-les-packs-de-paramètres-de-modèles">4. Indexation de packs (Pack Indexing) : Le salut pour les packs de paramètres de modèles
&lt;/h1>&lt;p>Les modèles variadiques (Variadic Templates) introduits depuis C++11 sont très puissants, mais l&amp;rsquo;opération consistant à extraire le $N$-ième type ou valeur d&amp;rsquo;un pack de paramètres n&amp;rsquo;était pas intuitive. Jusqu&amp;rsquo;à présent, il n&amp;rsquo;y avait pas d&amp;rsquo;autre choix que d&amp;rsquo;utiliser &lt;code>std::tuple_element&lt;/code> ou des modèles récursifs pour les extraire.&lt;/p>
&lt;p>En C++26, la fonctionnalité de &lt;strong>Pack Indexing&lt;/strong> (P2662) a été introduite, permettant une écriture plus naturelle, similaire à l&amp;rsquo;accès par index à un tableau.&lt;/p>
&lt;h2 id="41-les-bases-de-lindexation-de-packs">4.1 Les bases de l&amp;rsquo;Indexation de Packs
&lt;/h2>&lt;p>La syntaxe est très simple et s&amp;rsquo;écrit &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">// Fonction pour récupérer le N-ième type
&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">// Accès direct au N-ième type avec 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">// Fonction pour récupérer la N-ième valeur d&amp;#39;un nombre variable d&amp;#39;arguments
&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">// L&amp;#39;accès par index est également possible pour le pack de paramètres 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">// Accès au type
&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">// Accès à la valeur
&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">// Affiche &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>Le compilateur peut désormais traiter l&amp;rsquo;index de pack en temps constant $O(1)$, ce qui réduit les longs temps de compilation causés auparavant par l&amp;rsquo;imbrication de métafonctions.&lt;/p>
&lt;hr>
&lt;h1 id="5-extension-des-liaisons-structurées-structured-bindings">5. Extension des liaisons structurées (Structured Bindings)
&lt;/h1>&lt;p>Les liaisons structurées, introduites dans C++17, sont très pratiques pour recevoir les valeurs de retour multiples d&amp;rsquo;une fonction, mais lorsque l&amp;rsquo;on souhaite utiliser seulement certaines variables et ignorer les autres, il était nécessaire de définir des variables factices. Éviter l&amp;rsquo;avertissement de &amp;ldquo;variable inutilisée (unused variable)&amp;rdquo; demandait des efforts.&lt;/p>
&lt;p>En C++26, l&amp;rsquo;utilisation de &lt;code>_&lt;/code> (trait de soulignement) en tant que substitut (placeholder) a été officiellement autorisée.&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">// On ignore la valeur (chaîne) et on n&amp;#39;utilise que la clé (ID)
&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>Grâce à cette petite extension, l&amp;rsquo;intention du code devient plus claire, ce qui évite l&amp;rsquo;abus des &lt;code>#pragma&lt;/code> et de l&amp;rsquo;attribut &lt;code>[[maybe_unused]]&lt;/code> pour supprimer les avertissements inutiles.&lt;/p>
&lt;hr>
&lt;h1 id="6-lévolution-de-la-bibliothèque-standard--redéfinition-du-traitement-concurrent-et-asynchrone">6. L&amp;rsquo;évolution de la bibliothèque standard : Redéfinition du traitement concurrent et asynchrone
&lt;/h1>&lt;p>Outre les fonctionnalités du langage, la bibliothèque standard (STL) de C++26 a également subi une évolution spectaculaire. En particulier dans les domaines du traitement asynchrone et de la gestion de la mémoire, des composants avancés ont été introduits pour répondre aux exigences des environnements d&amp;rsquo;entreprise et de la programmation système.&lt;/p>
&lt;h2 id="61-senders--receivers-stdexecution">6.1 Senders / Receivers (std::execution)
&lt;/h2>&lt;p>La proposition de standardisation (P2300) visant à reconstruire de fond en comble le modèle de traitement asynchrone de C++ a finalement abouti dans C++26. Afin de résoudre les problèmes de performances (allocations de mémoire excessives et inefficacité de l&amp;rsquo;ordonnancement) dont souffraient &lt;code>std::async&lt;/code> et &lt;code>std::future&lt;/code>, le modèle &lt;strong>Senders/Receivers&lt;/strong> a été introduit.&lt;/p>
&lt;div class="mermaid">graph LR
S["Sender (Description de la tâche)"] -->|connect| O["État de l'opération"]
O -->|start| E["Exécution (ThreadPool, GPU, etc.)"]
E -->|set_value / set_error / set_stopped| R["Receiver (Rappel)"]&lt;/div>
&lt;p>Les Senders sont des plans de conception légers qui décrivent &amp;ldquo;ce qui doit être fait&amp;rdquo;, et ils sont séparés du contexte d&amp;rsquo;exécution (Scheduler). Cela permet de décrire efficacement la décharge de tâches (offload) vers un pool de threads CPU ou vers un GPU à l&amp;rsquo;aide d&amp;rsquo;une interface unifiée.&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">// Pipeline de tâches (n&amp;#39;est pas exécuté à ce stade : évaluation différée)
&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">// Attente synchrone du résultat avec 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-et-rcu-read-copy-update">6.2 Hazard Pointers et RCU (Read-Copy Update)
&lt;/h2>&lt;p>En tant que fonctionnalités standard soutenant l&amp;rsquo;implémentation de structures de données non bloquantes (lock-free), les &lt;strong>Hazard Pointers&lt;/strong> (&lt;code>std::hazard_pointer&lt;/code>) et le &lt;strong>RCU&lt;/strong> (&lt;code>std::rcu&lt;/code>) ont été standardisés. Cela a considérablement abaissé la barrière pour l&amp;rsquo;implémentation de structures de données concurrentes à hautes performances en C++.&lt;/p>
&lt;p>Le RCU élimine les conflits de ligne de cache (cache line) en particulier pour les charges de travail où les lectures (read) sont majoritaires, et permet une scalabilité linéaire. Mathématiquement parlant, pour un nombre de threads $T$, le débit de lecture présente une augmentation idéale de $O(T)$.&lt;/p>
$$
\text{Throughput}_{\text{RCU}} \propto T \quad \text{(Read-heavy Workloads)}
$$
&lt;hr>
&lt;h1 id="7-guide-de-transition-pratique-et-avantages-de-ladoption">7. Guide de transition pratique et avantages de l&amp;rsquo;adoption
&lt;/h1>&lt;p>La transition vers C++26 nécessite un changement de paradigme majeur, similaire à celui de C++11, mais offre l&amp;rsquo;avantage d&amp;rsquo;améliorer considérablement la sécurité de la base de code et les temps de compilation.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Refonte de la métaprogrammation&lt;/strong> : Les sérialiseurs et les frameworks ORM (Object-Relational Mapping) constitués d&amp;rsquo;imbrications complexes de &lt;code>template&lt;/code> et de &lt;code>constexpr if&lt;/code> peuvent voir leur maintenabilité augmenter de manière spectaculaire et leur temps de compilation se réduire à une fraction de ce qu&amp;rsquo;ils étaient s&amp;rsquo;ils sont réécrits en utilisant la réflexion de C++26.&lt;/li>
&lt;li>&lt;strong>Conception d&amp;rsquo;API avec les contrats&lt;/strong> : Les concepteurs de bibliothèques de classes devraient cesser de s&amp;rsquo;appuyer sur des commentaires de documentation tels que Doxygen, et utiliser les contrats (&lt;code>pre&lt;/code> / &lt;code>post&lt;/code>) pour spécifier explicitement le comportement au niveau du langage. Cela permet de détecter au plus tôt les appels non valides du côté de l&amp;rsquo;utilisateur.&lt;/li>
&lt;li>&lt;strong>Modernisation du traitement asynchrone&lt;/strong> : En migrant le traitement asynchrone basé sur des implémentations personnalisées ou Boost.Asio vers &lt;code>std::execution&lt;/code> (Senders/Receivers), il est possible de construire une infrastructure de traitement concurrent standardisée transcendante des plateformes et du matériel.&lt;/li>
&lt;/ol>
&lt;h2 id="points-dattention-lors-de-la-transition--stabilité-de-labi-et-support-des-compilateurs">Points d&amp;rsquo;attention lors de la transition : Stabilité de l&amp;rsquo;ABI et support des compilateurs
&lt;/h2>&lt;p>Les nouvelles fonctionnalités du langage, en particulier les contrats, pouvant affecter les signatures de fonctions et l&amp;rsquo;ABI (Application Binary Interface), il est impératif de s&amp;rsquo;assurer, lors de leur utilisation au-delà des limites de bibliothèques partagées (DLL / .so), qu&amp;rsquo;elles soient compilées avec la même version du compilateur et de la bibliothèque standard (GCC, Clang, MSVC).&lt;/p>
&lt;hr>
&lt;h1 id="conclusion">Conclusion
&lt;/h1>&lt;p>C++26 est véritablement une version historique où les &amp;ldquo;fonctionnalités de rêve&amp;rdquo; tant attendues par les programmeurs C++ depuis de nombreuses années ont été introduites d&amp;rsquo;un seul coup.&lt;/p>
&lt;ul>
&lt;li>Grâce à la &lt;strong>réflexion&lt;/strong>, la complexité de la métaprogrammation est dissipée et un accès à l&amp;rsquo;AST en $O(1)$ est réalisé.&lt;/li>
&lt;li>Grâce à la &lt;strong>programmation par contrat&lt;/strong>, les préconditions et postconditions des fonctions peuvent être explicites, permettant de construire des programmes robustes.&lt;/li>
&lt;li>Grâce au &lt;strong>filtrage par motif&lt;/strong>, les branchements complexes et les transitions d&amp;rsquo;état s&amp;rsquo;écrivent de manière intuitive et sécurisée.&lt;/li>
&lt;li>Grâce aux &lt;strong>Senders/Receivers&lt;/strong> et aux &lt;strong>RCU / Hazard Pointers&lt;/strong>, le traitement concurrent exploitant les performances extrêmes devient standard.&lt;/li>
&lt;/ul>
&lt;p>En utilisant ces fonctionnalités de manière appropriée, il devient possible de réaliser la &amp;ldquo;Zero-overhead Abstraction&amp;rdquo;, qui est la plus grande force de C++, à un niveau encore plus élevé et avec un code incroyablement propre.&lt;/p>
&lt;p>À l&amp;rsquo;avenir, tout en gardant un œil sur l&amp;rsquo;état d&amp;rsquo;implémentation des fonctionnalités C++26 par chaque fournisseur de compilateurs (Feature Test Macros, etc.), nous vous recommandons d&amp;rsquo;intégrer activement ces nouveaux paradigmes dans vos nouveaux projets et le développement de vos bibliothèques. Loin d&amp;rsquo;être un vieux langage, C++ continue d&amp;rsquo;incorporer avidement les théories de langage de pointe et restera probablement encore longtemps au sommet de la programmation système.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Cet article a été rédigé en fonction de l&amp;rsquo;état de la standardisation de C++26 en 2026. Veuillez noter que certaines syntaxes peuvent changer en fonction de l&amp;rsquo;état d&amp;rsquo;implémentation des différents compilateurs.&lt;/em>&lt;/p></description></item></channel></rss>