<?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/id/tags/tech/</link><description>Recent content in Tech on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>id</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 02:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/id/tags/tech/index.xml" rel="self" type="application/rss+xml"/><item><title>【Edisi 2026】Fitur Baru Utama C++26 dan Panduan Praktis Penggunaannya</title><link>http://kenji.blog/id/p/cpp26-new-features-practical-guide/</link><pubDate>Sat, 12 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/id/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 【Edisi 2026】Fitur Baru Utama C++26 dan Panduan Praktis Penggunaannya" />&lt;h1 id="pendahuluan-paradigma-pemrograman-generasi-berikutnya-yang-dibawa-oleh-c26">Pendahuluan: Paradigma Pemrograman Generasi Berikutnya yang Dibawa oleh C++26
&lt;/h1>&lt;p>Pada tahun 2026, &lt;strong>C++26&lt;/strong>, yang merupakan tonggak sejarah yang sangat penting dalam sejarah C++, telah secara resmi distandardisasi. Sejak konsep &amp;ldquo;Modern C++&amp;rdquo; lahir pada C++11, bahasa ini terus berkembang melalui C++14, C++17, C++20, dan C++23. Namun, C++26 membawa pergeseran paradigma yang sangat kuat, membalikkan akal sehat tentang metaprogramming, penanganan error, dan pemrosesan konkuren sejauh ini, baik dalam fungsionalitas bahasa maupun standar pustaka.&lt;/p>
&lt;p>Dalam artikel ini, kami akan menjelaskan secara menyeluruh fitur-fitur baru utama yang diperkenalkan pada C++26, perincian teknis, peningkatan performa waktu kompilasi, perbandingan dengan kode hingga C++23 yang sudah ada, serta panduan praktis penggunaannya. Dengan total volume artikel yang panjang, artikel ini mencakup berbagai topik secara komprehensif, mulai dari Reflection, Contract Programming (Contracts), Pattern Matching, Pack Indexing, perluasan Structured Bindings, hingga evolusi standar pustaka termasuk Senders/Receivers.&lt;/p>
&lt;p>Pertama, mari kita lihat sejarah standardisasi C++ dan posisi C++26 secara visual.&lt;/p>
&lt;div class="mermaid">timeline
title "Evolusi Standardisasi C++"
"C++11" : "Awal Mula Modern C++" : "auto, lambda, constexpr, move semantics"
"C++14" : "Penyempurnaan Fitur" : "generic lambda, return type deduction"
"C++17" : "Peningkatan Kepraktisan" : "std::optional, fold expressions, structured binding"
"C++20" : "Pergeseran Paradigma" : "Concepts, Modules, Coroutines, Ranges"
"C++23" : "Ekspansi Lebih Lanjut" : "Deducing this, std::expected, std::print"
"C++26" : "Revolusi Generasi Berikutnya" : "Reflection, Contracts, Pattern Matching"&lt;/div>
&lt;p>C++26 dibangun di atas kelompok fitur berskala besar seperti Concepts dan Modules yang diperkenalkan pada C++20, dan bertujuan untuk memaksimalkan &lt;strong>kemampuan kode mendeskripsikan dirinya sendiri (Reflection)&lt;/strong> dan &lt;strong>kekokohan (Contract Programming)&lt;/strong> hingga batas akhir. Sekarang, mari kita selami detail dari masing-masing fitur.&lt;/p>
&lt;hr>
&lt;h1 id="1-reflection-static-reflection-revolusi-sejati-metaprogramming">1. Reflection (Static Reflection): Revolusi Sejati Metaprogramming
&lt;/h1>&lt;p>Bisa dibilang fitur unggulan terbesar di C++26 adalah &lt;strong>Static Reflection (Refleksi Statis)&lt;/strong> (terutama didasarkan pada proposal seperti P2996). Sebelumnya di C++, untuk mendapatkan informasi mengenai struktur tipe atau variabel anggota dari dalam program, diperlukan penggunaan Template Metaprogramming (TMP) yang kompleks atau makro. Namun, berkat mekanisme Reflection C++26, kini kita dapat mengakses struktur program itu sendiri (AST: Abstrak Syntax Tree) secara aman dan intuitif saat proses kompilasi.&lt;/p>
&lt;h2 id="11-tantangan-pada-c23-dan-sebelumnya">1.1 Tantangan pada C++23 dan Sebelumnya
&lt;/h2>&lt;p>Mari kita pertimbangkan kasus di mana kita ingin melakukan serialisasi semua variabel anggota dari sebuah struct ke dalam JSON pada versi sebelum C++23. Karena tidak ada fungsi bahasa standar untuk me-list anggota sebuah struct, kita harus menggunakan pustaka pihak ketiga seperti Boost.Describe atau Boost.Pfr, atau mendefinisikan makro kustom untuk mendaftarkan anggota tersebut.&lt;/p>
&lt;p>Hal ini menyebabkan peningkatan waktu kompilasi dan pesan error yang sulit dipahami. Dari sudut pandang matematis, analisis informasi tipe menggunakan instansiasi template rekursif tradisional memerlukan kompleksitas waktu kompilasi $O(N)$ terhadap jumlah elemen $N$, dan pada fungsi meta yang rumit, instansiasi terburuknya adalah $O(N^2)$.&lt;/p>
$$
T_{\text{compile}}(N) \approx O(N^2) \quad \text{(Recursive Template Metaprogramming)}
$$
&lt;h2 id="12-sintaks-dan-pendekatan-reflection-c26">1.2 Sintaks dan Pendekatan Reflection C++26
&lt;/h2>&lt;p>Reflection C++26 menggunakan operator &lt;code>^&lt;/code> (operator refleksi) dan sintaks &lt;code>[: ... :]&lt;/code> (splicer). Dengan &lt;code>^T&lt;/code>, kita dapat mengambil &amp;ldquo;informasi meta&amp;rdquo; dari sebuah tipe atau variabel, dan itu diperlakukan sebagai konstanta waktu-kompilasi dari objek tipe &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 generik menggunakan Static Reflection 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">// Mengambil dan mengiterasi informasi anggota struct
&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">// Ekspansi ke simbol asli dengan [: member :], dan dapatkan identifier (nama) sebagai string
&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>Pada kode ini, &lt;code>template for&lt;/code> (ekspansi perulangan waktu-kompilasi) digunakan untuk me-list semua anggota dari struct &lt;code>User&lt;/code>.&lt;/p>
&lt;h2 id="13-performa-dan-kompleksitas-waktu-kompilasi">1.3 Performa dan Kompleksitas Waktu-Kompilasi
&lt;/h2>&lt;p>Manfaat terbesar dari fitur baru ini adalah &lt;strong>pengurangan waktu kompilasi&lt;/strong>. Karena informasi meta dimanipulasi langsung di dalam kompiler, akses elemen atau iterasi diproses dengan overhead $O(1)$. Karena langsung dievaluasi sebagai ekspresi konstan, kompleksitas waktu kompilasi meningkat secara dramatis (berkurang drastis).&lt;/p>
$$
T_{\text{compile\_new}}(N) = O(N) \quad \text{(Direct AST Traversal)}
$$
&lt;p>Kita dapat terbebas dari kehabisan memori kompiler akibat template yang bersarang atau pesan error yang sangat panjang (lautan error template).&lt;/p>
&lt;div class="mermaid">graph TD
A["Tipe: User"] -->| "^User" | B["std::meta::info"]
B -->| "nonstatic_data_members_of" | C["Rentang meta::info"]
C -->| "[: member :]" | D["Akses Anggota Langsung (obj.id, obj.name)"]
D --> E["Kode yang Dihasilkan (Nol Overhead)"]&lt;/div>
&lt;hr>
&lt;h1 id="2-contract-programming-contracts-desain-perangkat-lunak-yang-kokoh">2. Contract Programming (Contracts): Desain Perangkat Lunak yang Kokoh
&lt;/h1>&lt;p>Setelah lama diperdebatkan sejak penerapannya ditunda di C++20, &lt;strong>Contracts (Contract Programming)&lt;/strong> akhirnya diperkenalkan di C++26 (berdasarkan P2900, dsb.). Paradigma &amp;ldquo;Design by Contract&amp;rdquo; sekarang didukung secara bawaan oleh bahasa, memungkinkan kita untuk menuliskan pra-kondisi (Pre-condition), pasca-kondisi (Post-condition), dan asersi (Assertion) secara deklaratif untuk suatu fungsi.&lt;/p>
&lt;h2 id="21-sintaks-dasar-contracts">2.1 Sintaks Dasar Contracts
&lt;/h2>&lt;p>Pada C++26, atribut kontrak dilampirkan pada deklarasi fungsi.&lt;/p>
&lt;ul>
&lt;li>&lt;code>pre&lt;/code> : Kondisi yang harus dipenuhi sebelum fungsi dipanggil&lt;/li>
&lt;li>&lt;code>post&lt;/code> : Kondisi yang harus dipenuhi saat fungsi berakhir dan mengembalikan nilai&lt;/li>
&lt;li>&lt;code>assert&lt;/code> : Kondisi yang harus dipenuhi pada titik tertentu di dalam fungsi&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">// Perhitungan rata-rata yang aman menggunakan Contract Programming
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Pra-kondisi: Vektor yang dilewatkan tidak boleh kosong
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Pasca-kondisi: Rata-rata yang dihitung harus lebih besar dari atau sama dengan nilai minimum dan kurang dari atau sama dengan nilai maksimum vektor
&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">// Asersi selama proses berlangsung
&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">// Pengecekan NaN, dll.
&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">// Akan diikat ke &amp;#39;r&amp;#39; di pasca-kondisi
&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-penanganan-pelanggaran-kontrak-dan-evaluasi-saat-runtime">2.2 Penanganan Pelanggaran Kontrak dan Evaluasi Saat Runtime
&lt;/h2>&lt;p>Contracts bukan sekadar komentar atau makro &lt;code>assert()&lt;/code> kuno. Bergantung pada mode build (build pengembangan, build produksi, dll.), Anda dapat menginstruksikan kepada kompiler tentang &lt;strong>perilaku saat terjadi pelanggaran&lt;/strong>. Contohnya, selama masa pengembangan, pelanggaran akan memicu crash langsung (abort), sementara di lingkungan produksi, Anda dapat secara fleksibel memanggil penangan pelanggaran kustom yang mencatat log kemudian melanjutkan proses.&lt;/p>
&lt;div class="mermaid">graph TD
A["Fungsi Dipanggil"] --> B{"Evaluasi Pra-kondisi"}
B -- "Benar" --> C["Eksekusi Isi"]
B -- "Salah" --> D["Panggil Penangan Pelanggaran"]
D --> E["Catat Error / Batal / Lempar"]
C --> F{"Evaluasi Pasca-kondisi"}
F -- "Benar" --> G["Kembalikan Nilai"]
F -- "Salah" --> D&lt;/div>
&lt;p>Dengan menggunakan Contracts, spesifikasi API tidak hanya terdokumentasi sendiri (self-documenting), tetapi Anda juga dapat menghentikan dan mengontrol program dengan aman sebelum menyebabkan Undefined Behavior (UB), sehingga diharapkan dapat mengurangi secara drastis kerusakan memori dan bug logika yang khas pada C++.&lt;/p>
&lt;hr>
&lt;h1 id="3-pattern-matching-percabangan-yang-lebih-elegan">3. Pattern Matching: Percabangan yang Lebih Elegan
&lt;/h1>&lt;p>Sejak perkenalan &lt;code>std::variant&lt;/code> dan &lt;code>std::any&lt;/code> di C++17, &lt;code>std::visit&lt;/code> telah digunakan untuk dispatch tipe yang bervariasi pada suatu variabel. Namun, kombinasi dari &lt;code>std::visit&lt;/code> dan pola overload (sering disebut sebagai hack struktur &lt;code>overloaded&lt;/code>) sangat bertele-tele dan sulit dibaca.&lt;/p>
&lt;p>Di C++26, &lt;strong>Pattern Matching (Pencocokan Pola)&lt;/strong> telah dimasukkan sebagai fitur bahasa (sesuai standar P2688). Ini memungkinkan pencocokan yang intuitif, mirip dengan apa yang ada di bahasa fungsional (seperti Rust atau Haskell).&lt;/p>
&lt;h2 id="31-penderitaan-stdvisit-sebelum-c23">3.1 Penderitaan &lt;code>std::visit&lt;/code> Sebelum 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">// Penulisan kode hingga 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-peningkatan-dramatis-melalui-sintaks-inspect-di-c26">3.2 Peningkatan Dramatis Melalui Sintaks &lt;code>inspect&lt;/code> di C++26
&lt;/h2>&lt;p>Dengan menggunakan keyword baru &lt;code>inspect&lt;/code>, kita dapat menuliskannya secara jauh lebih ringkas seperti di bawah ini.&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">// Pattern Matching di 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;Tipe tidak diketahui&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>Pencocokan pola ini tidak hanya sebatas fungsi tipe dispatching, tetapi juga mendukung &lt;strong>destrukturisasi (pemecahan) struktur&lt;/strong> dan &lt;strong>kondisi guard&lt;/strong> (hanya cocok jika memenuhi kondisi tertentu).&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">// Mengikat elemen struktur sekaligus memberikan kondisi guard (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;Titik: &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;Skalar: &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>Kompiler melakukan pengecekan kelengkapan (Exhaustiveness checking) pada pernyataan &lt;code>inspect&lt;/code> ini, sehingga apabila ada kasus yang terlewat dalam menangani tipe enumerasi (enum) atau &lt;code>std::variant&lt;/code>, hal ini akan dilaporkan sebagai error kompilasi. Fitur ini sangat penting untuk meningkatkan kemampuan pemeliharaan (maintainability).&lt;/p>
&lt;hr>
&lt;h1 id="4-pack-indexing-penyelamat-variadic-templates">4. Pack Indexing: Penyelamat Variadic Templates
&lt;/h1>&lt;p>Sejak C++11, Variadic Templates (Template Variabel) sangatlah tangguh (powerful), namun operasi untuk mengekstrak tipe atau nilai ke-$N$ dari sebuah parameter pack tidaklah intuitif. Sebelumnya, kita hanya bisa mengeluarkannya menggunakan &lt;code>std::tuple_element&lt;/code> atau template rekursif.&lt;/p>
&lt;p>Di C++26, fitur &lt;strong>Pack Indexing&lt;/strong> (P2662) diperkenalkan, memungkinkan penulisan dengan cara yang lebih alami, mirip dengan mengakses indeks pada sebuah array.&lt;/p>
&lt;h2 id="41-dasar-dasar-pack-indexing">4.1 Dasar-dasar Pack Indexing
&lt;/h2>&lt;p>Sintaksnya sangat sederhana, dituliskan sebagai &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">// Fungsi untuk mendapatkan tipe ke-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">// Akses langsung tipe ke-N dengan 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">// Fungsi untuk mendapatkan nilai ke-N dari argumen variadic
&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">// Akses indeks pada parameter pack args juga dimungkinkan
&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">// Akses tipe
&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">// Akses nilai
&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">// Mencetak &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>Kompiler kini dapat memproses pack index dalam waktu konstan $O(1)$, yang akan mengurangi waktu kompilasi panjang yang sebelumnya disebabkan oleh fungsi meta bersarang.&lt;/p>
&lt;hr>
&lt;h1 id="5-perluasan-structured-bindings">5. Perluasan Structured Bindings
&lt;/h1>&lt;p>Structured Bindings yang diperkenalkan pada C++17 sangat berguna saat menerima banyak nilai kembalian dari suatu fungsi, tetapi apabila kita hanya ingin menggunakan beberapa variabel dan mengabaikan yang lain, kita perlu mendefinisikan variabel tiruan (dummy). Hal ini cukup merepotkan guna menghindari peringatan &amp;ldquo;unused variable&amp;rdquo; (variabel yang tidak digunakan).&lt;/p>
&lt;p>Di C++26, penggunaan &lt;code>_&lt;/code> (garis bawah/underscore) sebagai tempat penampung (placeholder) kini secara resmi diizinkan.&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">// Mengabaikan nilai (string) dan hanya menggunakan kunci (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>Ekstensi kecil ini memperjelas maksud/tujuan kode dan mencegah penyalahgunaan &lt;code>#pragma&lt;/code> atau atribut &lt;code>[[maybe_unused]]&lt;/code> yang bertujuan untuk menekan peringatan yang tidak perlu.&lt;/p>
&lt;hr>
&lt;h1 id="6-evolusi-standar-pustaka-redefinisi-pemrosesan-konkuren-dan-asinkron">6. Evolusi Standar Pustaka: Redefinisi Pemrosesan Konkuren dan Asinkron
&lt;/h1>&lt;p>Tidak hanya fitur bahasanya saja, Standar Pustaka C++26 (STL) juga telah mengalami evolusi yang dramatis. Khususnya di area pemrograman asinkron dan manajemen memori, komponen canggih yang memenuhi kebutuhan pemrograman kelas perusahaan dan sistem telah diperkenalkan.&lt;/p>
&lt;h2 id="61-senders--receivers-stdexecution">6.1 Senders / Receivers (std::execution)
&lt;/h2>&lt;p>Proposal standardisasi (P2300) yang merombak model pemrosesan asinkron C++ dari bawah ke atas pada akhirnya membuahkan hasil di C++26. Model &lt;strong>Senders/Receivers&lt;/strong> diperkenalkan untuk mengatasi masalah performa yang dimiliki &lt;code>std::async&lt;/code> atau &lt;code>std::future&lt;/code> (pengalokasian memori berlebihan dan inefisiensi penjadwalan).&lt;/p>
&lt;div class="mermaid">graph LR
S["Sender (Deskripsi Tugas)"] -->|connect| O["Status Operasi"]
O -->|start| E["Eksekusi (ThreadPool, GPU, dll.)"]
E -->|set_value / set_error / set_stopped| R["Receiver (Callback)"]&lt;/div>
&lt;p>Senders adalah cetak biru ringan yang mendeskripsikan &amp;ldquo;apa yang harus dilakukan&amp;rdquo;, dipisahkan dari konteks eksekusi (Scheduler). Hal ini memungkinkan kita mendeskripsikan pemindahan tugas ke ThreadPool CPU atau GPU dengan efisien melalui antarmuka yang seragam.&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">// Jalur tugas (belum dieksekusi pada saat ini: evaluasi tertunda)
&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">// Tunggu hasil secara sinkron dengan 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;Hasil: &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-dan-rcu-read-copy-update">6.2 Hazard Pointers dan RCU (Read-Copy Update)
&lt;/h2>&lt;p>Sebagai standar pendukung implementasi struktur data bebas-kunci, &lt;strong>Hazard Pointers&lt;/strong> (&lt;code>std::hazard_pointer&lt;/code>) dan &lt;strong>RCU&lt;/strong> (&lt;code>std::rcu&lt;/code>) telah distandardisasi. Hal ini sangat menurunkan rintangan untuk mengimplementasikan struktur data konkuren berperforma tinggi dalam C++.&lt;/p>
&lt;p>RCU menghilangkan persaingan cache line dan mencapai skalabilitas linear, terutama dalam beban kerja dengan proses baca yang sangat banyak. Secara matematis, throughput baca menunjukkan peningkatan yang ideal dari $O(T)$ sehubungan dengan jumlah thread $T$.&lt;/p>
$$
\text{Throughput}_{\text{RCU}} \propto T \quad \text{(Read-heavy Workloads)}
$$
&lt;hr>
&lt;h1 id="7-panduan-transisi-praktis-dan-manfaat-pengenalan">7. Panduan Transisi Praktis dan Manfaat Pengenalan
&lt;/h1>&lt;p>Migrasi ke C++26 memerlukan pergeseran paradigma skala besar seperti pada saat C++11, namun memiliki keuntungan nyata dalam meningkatkan keamanan basis kode dan mempercepat waktu kompilasi secara signifikan.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pembaruan Metaprogramming&lt;/strong>: Kerangka kerja serializer atau ORM (Object-Relational Mapping) yang tersusun dari fungsi &lt;code>template&lt;/code> dan &lt;code>constexpr if&lt;/code> bersarang yang rumit dapat ditulis ulang menggunakan Reflection dari C++26. Hal ini berpotensi meningkatkan kemampuan pemeliharaan secara drastis, serta memangkas waktu kompilasi menjadi sepersekian puluh dari sebelumnya.&lt;/li>
&lt;li>&lt;strong>Desain API Menggunakan Contracts&lt;/strong>: Para desainer class library tidak boleh bergantung pada komentar dokumentasi layaknya Doxygen, melainkan harus menentukan spesifikasi secara eksplisit pada tingkat bahasa menggunakan Contracts (&lt;code>pre&lt;/code> / &lt;code>post&lt;/code>). Ini memungkinan sistem mendeteksi panggilan ilegal dari pengguna di awal.&lt;/li>
&lt;li>&lt;strong>Memodernisasi Pemrosesan Asinkron&lt;/strong>: Dengan memindahkan pemrosesan asinkron yang tadinya mengandalkan implementasi custom maupun Boost.Asio ke dalam &lt;code>std::execution&lt;/code> (Senders/Receivers), Anda dapat membangun fondasi pemrosesan konkuren berstandar yang melintasi batas-batas antarmuka perangkat keras dan platform.&lt;/li>
&lt;/ol>
&lt;h2 id="peringatan-migrasi-stabilitas-abi-dan-dukungan-kompiler">Peringatan Migrasi: Stabilitas ABI dan Dukungan Kompiler
&lt;/h2>&lt;p>Fungsionalitas bahasa yang baru, terutama Contracts, mungkin berdampak pada function signatures maupun ABI (Application Binary Interface). Oleh karena itu, jika ingin menggunakannya melintasi batas-batas shared libraries (DLL / .so), Anda harus memverifikasi terlebih dahulu bahwa aplikasi sudah di-compile dengan versi standar pustaka dan kompiler yang identik (GCC, Clang, MSVC).&lt;/p>
&lt;hr>
&lt;h1 id="kesimpulan">Kesimpulan
&lt;/h1>&lt;p>C++26 adalah sebuah rilis bersejarah, dengan &amp;ldquo;fitur impian&amp;rdquo; yang telah lama dinanti oleh para programer C++ akhirnya diperkenalkan secara keseluruhan.&lt;/p>
&lt;ul>
&lt;li>Melalui &lt;strong>Reflection&lt;/strong>, kompleksitas metaprogramming telah dihilangkan dan akses AST dengan kompleksitas $O(1)$ pun terwujud.&lt;/li>
&lt;li>Melalui &lt;strong>Contract Programming&lt;/strong>, kita dapat menentukan secara eksplisit kondisi sebelum dan sesudah berjalannya fungsi, sehingga mampu menghasilkan program yang kokoh.&lt;/li>
&lt;li>Melalui &lt;strong>Pattern Matching&lt;/strong>, percabangan kompleks serta transisi status dapat ditulis secara logis, aman, dan intuitif.&lt;/li>
&lt;li>Melalui &lt;strong>Senders/Receivers&lt;/strong> dan &lt;strong>RCU / Hazard Pointers&lt;/strong>, standarisasi pada pemrosesan paralel dirilis, guna menarik kinerja setinggi-tingginya.&lt;/li>
&lt;/ul>
&lt;p>Dengan memanfaatkan beragam fitur ini dengan baik, abstraksi tanpa tambahan kinerja (&amp;ldquo;Zero-overhead Abstraction&amp;rdquo;), yang merupakan kekuatan utama pada C++, dapat diraih ke level yang lebih tinggi dengan menghasilkan kode yang sangat bersih secara menakjubkan.&lt;/p>
&lt;p>Kedepannya, kami sangat menyarankan untuk secara aktif mengadopsi berbagai paradigma baru ini ke dalam proyek dan pengembangan library terbaru milik Anda, sambil mengawasi progres dan penerapan fungsi di C++26 dari tiap vendor kompiler (seperti Feature Test Macros). Bahasa C++ bukanlah sebuah bahasa yang telah usang. Melalui penerapan aktif mengenai teori-teori bahasa paling mutakhir, C++ jelas akan terus memuncaki kedudukan di dunia pemrograman sistem di masa mendatang.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Artikel ini ditulis berdasarkan status pada standar C++26 di tahun 2026. Harap diperhatikan bahwa beberapa jenis sintaks mungkin dapat diubah bergantung dari progres dan situasi penerapan di tiap kompiler.&lt;/em>&lt;/p></description></item></channel></rss>