Saya baru-baru ini meneliti P4313 R1, sebuah proposal standar yang menambahkan operasi masker bit untuk enum melalui anotasi C++26. Konsep inti menggunakan `[[=std::bitmask_type]]` untuk menghasilkan operator bitwise secara otomatis, menghilangkan implementasi manual. Meskipun compiler C++ dengan senang hati menghitung operasi bitwise pada tipe integral, satu detail kritis melibatkan promosi integral.
Tipe yang lebih kecil dari `int`, seperti `short`, menjalani promosi ke `int` sebelum operasi terjadi. Ini berarti bahwa tipe hasil dari operasi pada tipe yang lebih kecil default ke `int`, membutuhkan `static_cast` kembali ke tipe aslinya untuk menghindari perilaku tak terduga. Selain itu, `bool` menunjukkan bahaya unik.
Konversi boolean tidak memotong pola bit; sebaliknya, ia memetakan nilai non-nol ke `true` ( nilai integer 1) dan nol ke `false`. Menggabungkan aturan ini mengungkapkan suatu keanehan: komplement dari `true` (`~true`) mempromosikan `true` ke `int` (nilai 1), menghitung hasil komplement dua sebagai `-2`, dan karena `-2` non-nol, konversi boolean mengembalikan `true`. Oleh karena itu, `static_cast(~true) == true`.
Perilaku ini meluas ke enum berbasis `bool`, seperti yang didefinisikan dengan `[[=std::bitmask_type]]`, menekankan pentingnya memahami konversi implisit ini untuk pengembangan C++ yang robust.
Sumber: Hacker News · Diringkas oleh HeadlinesBriefing