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 memiliki shared_ptr
anggota bernama p dan memiliki metode ini:, operator bool() const { return p; }
gagal mengkompilasi. Itu IMO bodoh.