Apakah idiom safe-bool usang dalam C ++ 11?

179

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 Tjika dan hanya jika deklarasi T t=e;tersebut dibentuk dengan baik, untuk beberapa variabel sementara yang ditemukan t(§8.5). Konstruk bahasa tertentu mengharuskan ekspresi dikonversi ke nilai Boolean. Ekspresi yang emuncul dalam konteks seperti itu dikatakan dikonversi secara kontekstual ke booldan terbentuk dengan baik jika dan hanya jika deklarasi bool 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] p1untuk 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.

Xeo
sumber
30
+1: Saya suka jenis pertanyaan yang mengajarkan saya hal-hal baru tentang standar yang akan datang.
Björn Pollex
1
Anda tahu apa yang dilemparkan oleh pemeran eksplisit tersirat dalam standar ... mengembalikan sesuatu dari yang lain operator bool. Sebagai contoh, jika saya memiliki shared_ptranggota bernama p dan memiliki metode ini:, operator bool() const { return p; }gagal mengkompilasi. Itu IMO bodoh.
David
Apa yang Anda maksud dengan pemeran "implisit eksplisit", @ David?
Sz.

Jawaban:

128

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.

Anak anjing
sumber
-5

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.

Luis Machuca
sumber
34
Saya murni berbicara di hadapan C ++ 11. Pertanyaan ini tidak menyentuh kode lama, kompatibilitas mundur, atau keengganan untuk mengubah ke kompiler sadar C ++ 11. Perhatikan juga bahwa C ++ 11 itu sendiri tidak sepenuhnya kompatibel, itu memperkenalkan perubahan melanggar.
Xeo
4
Tidak akan bisa tahu itu, maaf. Saya tidak hanya mempertimbangkan jawaban yang terkait di awal, tetapi juga fakta bahwa pertanyaan tersebut ditandai [c ++] dan [c ++ - faq], yang membuat saya berpikir bahwa evaluasi kedua tahap bahasa itu relevan.
Luis Machuca
1
Anda tentu saja benar, saya tidak secara eksplisit menyatakannya dalam pertanyaan. Saya akan mengeditnya, terima kasih atas kepala.
Xeo
1
Jawaban ini benar-benar dapat menggunakan pembaruan, sekarang hampir dua tahun.
Puppy
1
Saya harus mengundurkan diri karena ketidaksetujuan, meskipun saya akan membelikan Anda bir secara pribadi dan mengatakan "hei, tidak ada perasaan keras". Tetapi banyak paradigma dalam C ++ 11 mengalami penyebaran karena --std=c++0xjauh 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.
HostileFork mengatakan jangan percaya SE