Fitur yang kita pakai sehari-hari — std::span, std::expected, std::print — semuanya bermula sebagai dokumen proposal yang diperdebatkan publik sebelum menjadi standar. Mengetahui jalur ini mengubah cara kita melihat berita “C++ mengumumkan fitur baru”: yang diumumkan hampir selalu keputusan komite, bukan fitur yang siap dipakai di compiler. Chapter ini menunjukkan dari mana proposal berangkat, cara membacanya, dan cara memeriksa kapan sebuah fitur benar-benar sampai di compiler kita — lengkap dengan program pemeriksaan yang bisa kita jalankan sendiri.
WG21 dan Jalur Sebuah Proposal #
Standar C++ disusun komite ISO bernama WG21 , yang arsip proposalnya terbuka untuk umum melalui laman papers di situs open-std.org. Jalurnya panjang namun mudah diikuti: proposal diajukan, dibahas di beberapa pertemuan, lalu bila disetujui masuk ke working draft — teks standar yang sedang disusun — hingga versi akhir diterbitkan. Ringkasan hasil tiap pertemuan komite paling mudah diikuti lewat trip report yang ditulis Herb Sutter di herbsutter.com , sementara isocpp.org/std/status merangkum fitur per versi standar dengan tautan ke proposal asalnya. Per Oktober 2026, C++23 adalah versi terbit terakhir dan C++26 telah selesai secara teknis menunggu publikasi ISO — status mutakhirnya selalu bisa kita cek di halaman tersebut.
Membaca Proposal Bernomor P #
Setiap proposal memiliki nomor berformat PxxxxRn: huruf P, empat digit nomor, dan revisi ke-n. Contoh yang sudah kita kenal: P0122R7 adalah proposal std::span dan P0323R12 adalah proposal std::expected — revisinya sampai ke-12, bukti bahwa sebuah fitur bisa bertahun-tahun dalam perbaikan. Cara membaca yang efisien: mulai dari bagian Abstract untuk satu kalimat tujuan, lanjut ke Motivation untuk masalah yang dijawab, lalu Design untuk keputusan pentingnya. Kita tidak perlu memahami semua detail formal; tiga bagian itu sudah memberi jawaban “mengapa fitur ini ada”, sesuatu yang dokumentasi referensi jarang jelaskan.
Menanyakan Dukungan Compiler #
Jembatan antara “disetujui komite” dan “bisa dikompilasi” adalah dua sumber berikut:
- Halaman dukungan compiler di cppreference — tabel besar per fitur, per compiler, dan per versi; halaman pertama yang kita buka sebelum memakai fitur muda.
- Feature testing recommendations (SD-6)
— dokumen resmi yang menetapkan feature test macro seperti
__cpp_lib_format; daftar lengkapnya juga tersedia di cppreference .
Feature test macro adalah konstanta preprocessor berisi tanggal fitur dalam format YYYYMM. Macro bahasa seperti __cpp_concepts didefinisikan langsung oleh compiler, sedangkan macro library seperti __cpp_lib_format didefinisikan oleh standard library melalui header <version> — perbedaan kecil yang sering mengecoh. Dua pemeriksaan cepat lain dari keluarga yang sama: __cplusplus berisi versi standar yang aktif, dan __has_include("nama_header") menguji keberadaan sebuah header.
Pemeriksaan Macro dalam Program #
Program berikut mencetak nilai delapan macro yang relevan dengan course ini. Perhatikan bagian mana yang butuh <version> — tanpa header tersebut, dua macro library terakhir tidak terdefinisi:
#include <iostream>
#include <version> // macro __cpp_lib_* (library) didefinisikan di sini
// Pemeriksaan feature test macro: cara resmi menanyakan dukungan fitur
// pada compiler yang sedang kita pakai. Nilainya berupa tanggal (YYYYMM).
int main() {
#ifdef __cplusplus
std::cout << "__cplusplus = " << __cplusplus << "\n";
#else
std::cout << "__cplusplus tidak didefinisikan\n";
#endif
#ifdef __cpp_concepts
std::cout << "__cpp_concepts = " << __cpp_concepts << "\n";
#else
std::cout << "__cpp_concepts tidak didefinisikan\n";
#endif
#ifdef __cpp_structured_bindings
std::cout << "__cpp_structured_bindings = " << __cpp_structured_bindings << "\n";
#else
std::cout << "__cpp_structured_bindings tidak didefinisikan\n";
#endif
#ifdef __cpp_lib_span
std::cout << "__cpp_lib_span = " << __cpp_lib_span << "\n";
#else
std::cout << "__cpp_lib_span tidak didefinisikan\n";
#endif
#ifdef __cpp_lib_format
std::cout << "__cpp_lib_format = " << __cpp_lib_format << "\n";
#else
std::cout << "__cpp_lib_format tidak didefinisikan\n";
#endif
#ifdef __cpp_lib_print
std::cout << "__cpp_lib_print = " << __cpp_lib_print << "\n";
#else
std::cout << "__cpp_lib_print tidak didefinisikan\n";
#endif
#ifdef __cpp_lib_expected
std::cout << "__cpp_lib_expected = " << __cpp_lib_expected << "\n";
#else
std::cout << "__cpp_lib_expected tidak didefinisikan\n";
#endif
#ifdef __cpp_lib_ranges
std::cout << "__cpp_lib_ranges = " << __cpp_lib_ranges << "\n";
#else
std::cout << "__cpp_lib_ranges tidak didefinisikan\n";
#endif
return 0;
}Output yang Dihasilkan:
__cplusplus = 202302
__cpp_concepts = 202002
__cpp_structured_bindings = 201606
__cpp_lib_span = 202002
__cpp_lib_format = 202110
__cpp_lib_print = 202211
__cpp_lib_expected = 202211
__cpp_lib_ranges = 202302Bedah program di atas:
- Pola
#ifdef ... #else ... #endif: setiap macro diperiksa satu per satu; bila compiler tidak mendukungnya, program tetap terkompilasi dan justru mencatat ketiadaannya — inilah cara kode portabel menyesuaikan diri. #include <version>: wajib untuk macro__cpp_lib_*; macro bahasa seperti__cpp_conceptsbekerja tanpa header apa pun karena disediakan compiler.- Nilai berformat tanggal:
202211berarti fitur masuk pada November 2022; makin besar nilainya, makin muda revisi fitur yang disediakan implementasi kita. __cplusplus = 202302: standar yang aktif saat kompilasi; pada compiler dengan-std=c++20nilainya berubah menjadi202002— coba ganti flag-nya untuk membuktikannya.
Dengan cara mengejar fitur baru di kertas sudah kita kuasai, saatnya menghadapi pihak yang mengubah proposal menjadi program berjalan: compiler dan toolchain-nya. Chapter berikutnya memetakan dokumentasi resmi GCC, Clang, MSVC, serta alat eksperimen dan build yang menyertai mereka.