C ++ 17 แนะนำ[[nodiscard]]
คุณสมบัติซึ่งอนุญาตให้โปรแกรมเมอร์ทำเครื่องหมายฟังก์ชั่นในลักษณะที่คอมไพเลอร์สร้างคำเตือนหากวัตถุที่ถูกส่งคืนถูกยกเลิกโดยผู้เรียก สามารถเพิ่มแอตทริบิวต์เดียวกันในประเภทคลาสทั้งหมดได้
ฉันได้อ่านเกี่ยวกับแรงจูงใจของคุณลักษณะนี้ในข้อเสนอเดิมและฉันรู้ว่า C ++ 20 จะเพิ่มคุณสมบัติให้กับฟังก์ชั่นมาตรฐานเช่นstd::vector::empty
ชื่อของผู้ที่ไม่ได้สื่อความหมายที่ชัดเจนเกี่ยวกับค่าส่งคืน
มันเป็นคุณสมบัติที่ยอดเยี่ยมและมีประโยชน์ ในความเป็นจริงมันดูเหมือนว่ามีประโยชน์มากเกินไป ทุกที่ที่ฉันอ่าน[[nodiscard]]
คนพูดถึงราวกับว่าคุณเพิ่งเพิ่มไปยังฟังก์ชั่นหรือประเภทที่เลือกและลืมส่วนที่เหลือ แต่ทำไมค่าที่ไม่สามารถละทิ้งได้ควรเป็นกรณีพิเศษโดยเฉพาะเมื่อเขียนโค้ดใหม่ ค่าส่งคืนที่ถูกทิ้งมักจะเป็นข้อบกพร่องหรืออย่างน้อยก็เป็นการสิ้นเปลืองทรัพยากรหรือไม่
และไม่ใช่หนึ่งในหลักการออกแบบของ C ++ ที่คอมไพเลอร์ควรตรวจจับข้อผิดพลาดให้ได้มากที่สุด
ถ้าเป็นเช่นนั้นทำไมไม่เพิ่ม[[nodiscard]]
รหัสที่ไม่ใช่มรดกของคุณเองลงในvoid
ฟังก์ชั่นที่ไม่ใช่ฟังก์ชั่นเดียวและเกือบทุกประเภทของคลาส?
ฉันพยายามที่จะทำในรหัสของตัวเองและมันทำงานได้ดียกเว้นว่ามัน verbose ชะมัดว่ามันเริ่มรู้สึกเหมือน Java มันจะดูเหมือนธรรมชาติมากขึ้นที่จะทำให้คอมไพเลอร์เตือนเกี่ยวกับการคืนค่าทิ้งไปโดยปริยาย ยกเว้นสำหรับกรณีอื่น ๆ ไม่กี่ที่คุณทำเครื่องหมายความตั้งใจของคุณ[*]
ตามที่ฉันได้เห็นการอภิปรายเป็นศูนย์เกี่ยวกับความเป็นไปได้นี้ในข้อเสนอมาตรฐานรายการบล็อกคำถามซ้อนมากเกินไปหรือที่อื่นบนอินเทอร์เน็ตฉันต้องหายไปบางสิ่งบางอย่าง
ทำไมกลศาสตร์ดังกล่าวไม่สมเหตุสมผลในรหัส C ++ ใหม่ การใช้คำฟุ่มเฟื่อยเป็นเหตุผลเดียวที่จะไม่ใช้[[nodiscard]]
เกือบทุกที่?
[*] ตามทฤษฏีคุณอาจมีลักษณะคล้ายกับ[[maydiscard]]
แอตทริบิวต์แทนซึ่งสามารถเพิ่มย้อนหลังให้กับฟังก์ชั่นเช่นprintf
ในการใช้งานไลบรารีมาตรฐาน
const
สามารถขยายตัวชั้นเป็นอย่างอื่น "ง่าย" (หรือมากกว่า "ข้อมูลเก่าธรรมดาวัตถุ") อย่างมากใน C ++
std::vector
หรือstd::unique_ptr
ซึ่งคุณต้องการสมาชิกข้อมูลในการกำหนดคลาสของคุณ ฉันทำงานกับทั้งสองภาษา Java เป็นภาษาที่โอเค แต่มันมีความละเอียดมากกว่า
operator =
ตัวอย่างเช่น. และstd::map::insert
.