คำตอบของ @R นี้ Martinho Fernandesแสดงให้เห็นว่าสำนวน safe-bool นั้นถูกคัดค้านอย่างชัดเจนใน C ++ 11 เนื่องจากมันสามารถแทนที่ได้โดยง่าย
explicit operator bool() const;
ตามคำพูดมาตรฐานในคำตอบ§4 [conv] p3:
นิพจน์ e สามารถแปลงเป็นประเภทโดยปริยาย
TหากการประกาศT t=e;นั้นมีรูปแบบที่ดีสำหรับตัวแปรชั่วคราวที่ประดิษฐ์ขึ้นมาบางส่วนt(§8.5) โครงสร้างภาษาบางภาษาต้องการให้นิพจน์ถูกแปลงเป็นค่าบูลีน การแสดงออกeที่ปรากฏในบริบทดังกล่าวกล่าวคือจะต้องแปลงบริบทการboolและเป็นรูปแบบที่ดีและถ้าหากการประกาศbool t(e);เป็นรูปแบบที่ดีสำหรับบางคนคิดค้นตัวแปรเสื้อชั่วคราว (§8.5)
ส่วนที่ไฮไลต์จะแสดงให้เห็นอย่างชัดเจนว่า "การส่งแบบชัดเจนโดยนัย" (เรียกว่า "การแปลงตามบริบท" ในมาตรฐาน) เป็น @R Martinho วางไว้
"การสร้างภาษาบางอย่าง" ที่ต้องการให้ "cast ชัดแจ้งชัดเจน" ดูเหมือนจะดังต่อไปนี้:
if,while,for(§6.4 [stmt.select] p4)- ตัวดำเนินการเชิงตรรกะแบบไบนารี
&&และ||(§5.14 [expr.log.and/or] p1สำหรับทั้งคู่) - ผู้ประกอบการปฏิเสธตรรกะ
!(§5.3.1 [expr.unary.op] p9) - ผู้ประกอบการตามเงื่อนไข
?:(§5.14 [expr.cond] p1) static_assert(§7 [dcl.dcl] p4)noexcept(§15.4 [except.spec] p2)
สมมติฐานของเราในชื่อถูกต้องหรือไม่ ฉันหวังว่าเราจะไม่มองข้ามข้อเสียที่อาจเกิดขึ้น
operator boolกลับมาบางสิ่งบางอย่างจากที่อื่น ตัวอย่างเช่นถ้าฉันมีshared_ptrสมาชิกชื่อ p และมีวิธีนี้: operator bool() const { return p; }มันล้มเหลวในการรวบรวม นั่นคือ IMO ที่โง่