พิมพ์ทฤษฎีพูดvoidคือสิ่งที่เรียกในภาษาอื่น ๆหรือunit topเทียบเท่าตรรกะของมันคือทรู ค่าใด ๆ สามารถนำไปใช้ได้อย่างถูกต้องตามกฎหมายvoid(ทุกประเภทเป็นประเภทย่อยvoid) คิดว่ามันเป็นชุด "จักรวาล"; มีการดำเนินงานในเรื่องธรรมดาที่จะไม่มีทุกvoidค่าในโลกดังนั้นจึงไม่มีการดำเนินการที่ถูกต้องในค่าของชนิด ใช้อีกวิธีหนึ่งโดยบอกคุณว่ามีบางสิ่งในชุดจักรวาลไม่ให้ข้อมูลใด ๆ - คุณรู้แล้ว ดังนั้นต่อไปนี้เป็นเสียง:
(void)5;
(void)foo(17); // whatever foo(17) does
แต่การมอบหมายด้านล่างไม่ใช่:
void raise();
void f(int y) {
int x = y!=0 ? 100/y : raise(); // raise() returns void, so what should x be?
cout << x << endl;
}
[[noreturn]]บนมืออื่น ๆ ที่เรียกว่าบางครั้งempty, Nothing, BottomหรือBotและเป็นเทียบเท่าตรรกะของเท็จ มันไม่มีค่าเลยและการแสดงออกของประเภทนี้สามารถส่งไปที่ (เช่นประเภทย่อย) ประเภทใด ๆ นี่คือชุดที่ว่างเปล่า โปรดทราบว่าหากมีคนบอกคุณว่า "คุณค่าของนิพจน์ foo () เป็นของเซตว่าง" มันเป็นข้อมูลที่มาก - มันบอกคุณว่านิพจน์นี้จะไม่ดำเนินการตามปกติให้เสร็จสมบูรณ์ มันจะยกเลิกโยนหรือแขวน voidมันเป็นตรงกันข้าม
ดังนั้นสิ่งต่อไปนี้ไม่สมเหตุสมผล (pseudo-C ++ เนื่องจากnoreturnไม่ใช่ประเภท C ++ ชั้นหนึ่ง)
void foo();
(noreturn)5; // obviously a lie; the expression 5 does "return"
(noreturn)foo(); // foo() returns void, and therefore returns
แต่การมอบหมายด้านล่างถูกต้องตามกฎหมายอย่างสมบูรณ์เนื่องจากthrowคอมไพเลอร์เข้าใจว่าจะไม่ส่งคืน:
void f(int y) {
int x = y!=0 ? 100/y : throw exception();
cout << x << endl;
}
ในโลกที่สมบูรณ์แบบคุณสามารถใช้noreturnเป็นค่าตอบแทนสำหรับฟังก์ชั่นraise()ด้านบน:
noreturn raise() { throw exception(); }
...
int x = y!=0 ? 100/y : raise();
Sadly C ++ ไม่อนุญาตให้ใช้อาจเป็นไปได้ว่าด้วยเหตุผลเชิงปฏิบัติ แต่จะให้ความสามารถในการใช้[[ noreturn ]]คุณสมบัติซึ่งช่วยให้แนวทางการปรับแต่งคอมไพเลอร์และคำเตือน