สำนวน safe-bool ล้าสมัยใน C ++ 11 หรือไม่


179

คำตอบของ @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)

สมมติฐานของเราในชื่อถูกต้องหรือไม่ ฉันหวังว่าเราจะไม่มองข้ามข้อเสียที่อาจเกิดขึ้น


30
+1: ฉันชอบคำถามประเภทนี้ที่สอนสิ่งใหม่เกี่ยวกับมาตรฐานที่กำลังจะมาถึง
Björn Pollex

1
คุณจะรู้ว่าสิ่งที่ส่อหล่ออย่างชัดเจนจะหายไปในมาตรฐาน ... operator boolกลับมาบางสิ่งบางอย่างจากที่อื่น ตัวอย่างเช่นถ้าฉันมีshared_ptrสมาชิกชื่อ p และมีวิธีนี้: operator bool() const { return p; }มันล้มเหลวในการรวบรวม นั่นคือ IMO ที่โง่
David

@David หมายถึงอะไรโดยนักแสดง "โดยนัยชัดเจน"
Sz.

คำตอบ:


128

ใช่. นี่คือตัวอย่างสำหรับปัญหาเกี่ยวกับการมีเพียงแปลงที่ผู้ใช้กำหนดโดยปริยายและผู้ใช้กำหนดผู้ประกอบการแปลงอย่างชัดเจนถูกจริงคิดค้นเพราะปัญหานี้และที่จะเปลี่ยนทุกสิ่งที่ปลอดภัยบูลกับสิ่งที่ทำความสะอาดจำนวนมากและตรรกะมากขึ้น


-5

ฉันจะไม่เรียกมันว่า "ล้าสมัย" ไม่ใช่ทุกคนที่ก้าวกระโดดไปที่ C ++ 11 (ยังไม่ถึง1 ปี ) ณ ตอนนี้ และถึงแม้ว่าจะมีโคเดอเรเตอร์จำนวนมาก แต่ความสามารถในการรักษาโค้ดไว้ข้างหลังจะต้องเป็นสิ่งที่ต้องคำนึงถึงเพราะสำนวนประเภทนี้ดูเหมือนจะเหมาะสมกว่าสำหรับห้องสมุดมากกว่าสำหรับโปรแกรมที่เหมาะสม


34
ฉันพูดอย่างบริสุทธิ์ใจต่อหน้า C ++ 11 คำถามนี้ไม่ได้สัมผัสรหัสเก่า, ความเข้ากันได้แบบย้อนหลังหรือความไม่เต็มใจที่จะเปลี่ยนเป็นคอมไพเลอร์ทราบ C ++ 11 โปรดทราบด้วยว่า C ++ 11 ในตัวมันเองนั้นไม่สามารถใช้งานร่วมกับระบบย้อนหลังได้อย่างสมบูรณ์มันแนะนำการเปลี่ยนแปลงแบบไม่ต่อเนื่อง
Xeo

4
คงไม่สามารถรู้ได้ว่าขอโทษ ฉันไม่ได้พิจารณาเฉพาะคำตอบที่เชื่อมโยงในตอนแรก แต่ยังรวมถึงความจริงที่ว่าคำถามถูกติดแท็ก [c ++] และ [c ++ - faq] ซึ่งทำให้ฉันคิดว่าการประเมินทั้งสองขั้นของภาษานั้นมีความเกี่ยวข้อง
Luis Machuca

1
แม้ว่าคุณจะถูกต้องแน่นอนฉันไม่ได้ระบุไว้อย่างชัดเจนในคำถาม ฉันจะแก้ไขมันในขอบคุณสำหรับหัวขึ้น
Xeo

1
คำตอบนี้สามารถใช้การอัปเดตจริงๆตอนนี้มันเกือบสองปีแล้ว
ลูกสุนัข

1
ฉันจะต้องลงคะแนนเนื่องจากความไม่เห็นด้วยแม้ว่าฉันจะซื้อเบียร์ด้วยตนเองและพูดว่า "เฮ้ไม่มีความรู้สึกที่ยากลำบาก" แต่กระบวนทัศน์จำนวนมากใน C ++ 11 กำลังประสบปัญหาในการติดตั้งเนื่องจาก--std=c++0xเล็บรุ่นสุดท้ายได้รับการผลักดันเข้าสู่โลงศพมาตรฐาน เว้นแต่ว่าคุณจะเป็นเทมเพลตการวางผังแม่แบบลึก ๆ จริงๆรายละเอียดของสเป็ค C ++ 11 เทียบกับสิ่งที่ผู้คนใช้ไม่น่าจะเป็นผลกับคุณ ... ซึ่งหมายความว่ามันเก่ากว่าปี 2011 สำหรับการใช้งานจริงเกือบทั้งหมด และตอนนี้นาฬิกาของฉันใกล้จะถึงปี 2015 แล้ว
HostileFork บอกว่าอย่าไว้ใจ SE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.