พิมพ์ทฤษฎีพูด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 ]]
คุณสมบัติซึ่งช่วยให้แนวทางการปรับแต่งคอมไพเลอร์และคำเตือน