คำตอบของ @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 ที่โง่