Jawaban @R ini. Martinho Fernandes menunjukkan, bahwa idiom safe-bool sudah tidak digunakan lagi dalam C ++ 11, karena dapat diganti dengan sederhana
explicit operator bool() const;
sesuai dengan kutipan standar dalam jawabannya §4 [conv] p3
:
Ekspresi e dapat secara implisit dikonversi menjadi tipe
T
jika dan hanya jika deklarasiT t=e;
tersebut dibentuk dengan baik, untuk beberapa variabel sementara yang ditemukant
(§8.5). Konstruk bahasa tertentu mengharuskan ekspresi dikonversi ke nilai Boolean. Ekspresi yange
muncul dalam konteks seperti itu dikatakan dikonversi secara kontekstual kebool
dan terbentuk dengan baik jika dan hanya jika deklarasibool t(e);
tersebut terbentuk dengan baik , untuk beberapa variabel sementara yang diciptakan t (§8.5).
Bagian yang disorot dengan jelas menunjukkan "pemeran eksplisit implisit" (disebut "konversi kontekstual" dalam standar) sebagai @R. Martinho menuliskannya.
"Konstruksi bahasa tertentu" yang mengharuskan "pemeran eksplisit implisit" tampaknya adalah sebagai berikut:
if
,while
,for
(§6.4 [stmt.select] p4
)- operator logika biner
&&
dan||
(§5.14 [expr.log.and/or] p1
untuk keduanya) - operator negasi logis
!
(§5.3.1 [expr.unary.op] p9
) - operator kondisional
?:
(§5.14 [expr.cond] p1
) static_assert
(§7 [dcl.dcl] p4
)noexcept
(§15.4 [except.spec] p2
)
Apakah asumsi kami dalam judul itu benar? Saya harap kami tidak mengabaikan kelemahan potensial.
operator bool
. Sebagai contoh, jika saya memilikishared_ptr
anggota bernama p dan memiliki metode ini:,operator bool() const { return p; }
gagal mengkompilasi. Itu IMO bodoh.Jawaban:
Iya. Ini adalah yang contoh masalah dengan hanya memiliki konversi yang ditetapkan pengguna implisit dan operator konversi eksplisit ditetapkan pengguna praktis diciptakan karena masalah ini dan untuk mengganti semua hal yang aman-bool dengan sesuatu yang jauh lebih bersih dan lebih logis.
sumber
Saya tidak akan menyebutnya "usang". Belum semua orang mengambil lompatan ke C ++ 11 (bahkan belum 1 tahun ). Dan bahkan jika jumlah coder yang baik, kemampuan untuk menjaga kode yang kompatibel tetap menjadi keharusan, mengingat idiom semacam ini tampaknya lebih masuk akal untuk perpustakaan daripada untuk program yang tepat.
sumber
--std=c++0x
jauh sebelum paku terakhir didorong ke peti mati standar dan mereka memutuskan untuk meletakkan nama pada spesifikasi ISO. Kecuali jika Anda seorang pecandu metaprogramming template yang sangat dalam, detail dari spesifikasi C ++ 11 vs apa yang orang gunakan kemungkinan tidak ada konsekuensinya bagi Anda ... yang berarti itu lebih tua dari 2011 untuk hampir semua tujuan praktis bahkan saat itu. Dan sekarang, pada jam saya, hampir tahun 2015.