C++14 sengaja diberi nama “release pemoles” (di komunitas sering disebut minor berbanding C++11 yang major): standar ini tidak mengubah arah bahasa, melainkan menutup rasa janggal yang ditinggalkan C++11. Lambda C++11 menolak parameter auto, fungsi dengan return type deduction terbatas pada lambda, literal biner harus ditulis heksadesimal, angka besar rapat tanpa pemisah, dan constexpr tidak boleh berisi loop. C++14 menjawab kelimanya, ditambah atribut [[deprecated]] untuk menandai API lama. Karena sifatnya memoles, chapter ini pendek namun penting — fitur-fiturnya begitu menyatu dengan gaya modern sehingga kita akan memakainya tanpa sadar di semua chapter berikutnya.
Program Demo Fitur C++14 #
Semua fitur C++14 berikut diuji dengan satu file yang dikompilasi -std=c++14 — tidak ada sintaks C++17 ke atas.
// fitur-cpp14.cpp — perbaikan halus yang membuat C++11 semakin nyaman
// Kompilasi: g++ -std=c++14 -Wall -Wextra fitur-cpp14.cpp -o fitur14
#include <iostream>
#include <string>
// C++14: generic lambda — parameter auto, tipe disimpulkan tiap pemanggilan
auto kalikan = [](auto a, auto b) { return a * b; };
// C++14: return type deduction — compiler menyimpulkan tipe kembalian fungsi
auto beriLabel(bool aktif) {
if (aktif) {
return std::string("AKTIF");
}
return std::string("NONAKTIF");
}
// C++14: relaxed constexpr — loop dan variabel lokal kini diperbolehkan
constexpr int pangkat(int basis, int eksponen) {
int hasil = 1;
for (int i = 0; i < eksponen; ++i) {
hasil *= basis;
}
return hasil;
}
// C++14: penanda [[deprecated]] — peringatan bagi pemanggil versi lama
[[deprecated("gunakan hitungBaru()")]]
int hitungLama(int x) { return x + 1; }
int hitungBaru(int x) { return x * 10; }
int main() {
std::cout << kalikan(3, 4) << " " << kalikan(2.5, 4.0) << "\n";
std::cout << beriLabel(true) << "\n";
constexpr int duaPangkatSepuluh = pangkat(2, 10); // dihitung saat kompilasi
static_assert(duaPangkatSepuluh == 1024, "constexpr wajib jalan saat kompilasi");
std::cout << duaPangkatSepuluh << "\n";
std::cout << 0b1010 << " " << 0b1010'0110 << "\n"; // binary literal + separator
std::cout << hitungBaru(7) << "\n";
return 0;
}Output yang Dihasilkan:
12 10
AKTIF
1024
10 166
70Mari kita bedah:
- Baris 8 (generic lambda): parameter
automembuat lambda menjadi template kecil; pemanggilan pertama menyimpulkanint(3×4=12), pemanggilan keduadouble(2.5×4.0=10). Lambda C++11 hanya bisa satu tipe tetap. - Baris 11-16 (return type deduction):
auto beriLabel(...)tanpa-> std::string— compiler menyimpulkan kembalian dari pernyataanreturn. Syaratnya semua jalurreturnmenghasilkan tipe yang sama; keduanyastd::string, jadi sah. - Baris 19-25 (relaxed constexpr): loop
for, variabel lokalhasil, dan mutasi semuanya kini legal di dalamconstexpr. C++11 melarang semuanya, sehingga perhitungan seperti pangkat harus ditulis rekursif. - Baris 37-39 (pembuktian compile time):
constexpr int duaPangkatSepuluhmemaksa perhitungan terjadi saat kompilasi;static_assertmemvalidasinya — bilapangkattidak bisa dihitung saat kompilasi, kompilasi gagal, bukan sekadar hasil 1024 di runtime. - Baris 41 (binary literal + digit separator):
0b1010berarti 10, dan0b1010'0110= 166 dengan tanda'murni pembacaan manusia — nilainya sama dengan0b10100110. - Baris 28-29 ([[deprecated]]): penanda dipasang, tetapi sengaja
hitungLamatidak dipanggil agar program bebas warning. Lihat blok berikut untuk efeknya saat dipanggil.
Efek [[deprecated]] di Compiler #
Atribut [[deprecated]] tidak mengubah perilaku program — ia hanya bicara ke compiler. Bila seseorang memanggil hitungLama(7), g++ 14.2 mengeluarkan peringatan persis seperti ini:
warning: ‘int hitungLama(int)’ is deprecated: gunakan hitungBaru() [-Wdeprecated-declarations]
43 | std::cout << hitungLama(7) << "\n";
| ~~~~~~~~~~^~~
/tmp/dep.cpp:29:5: note: declared hereKarena -Wdeprecated-declarations ikut -Wall, pemanggil lama langsung terlihat saat build — dengan alasan berlabel yang kita tulis sendiri. Pola ini ideal saat memigrasi API: tandai dulu, beri masa transisi, baru hapus di rilis berikutnya.
C++14 terasa kecil di atas kertas, tetapi efeknya besar pada kenyamanan: loop di constexpr saja sudah mengubah ribuan baris metaprogramming menjadi kode biasa. Standar berikutnya, C++17, kembali masif — kita lihat di chapter berikutnya.
Rujukan resmi: cppreference — fitur C++14 , cppreference — constexpr .