सैद्धांतिक रूप से बोलना, 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
और के तार्किक बराबर है झूठी । इसका कोई मूल्य नहीं है, और इस प्रकार की अभिव्यक्ति को किसी भी प्रकार के लिए (यानी उप-प्रकार) में डाला जा सकता है। यह खाली सेट है। ध्यान दें कि यदि कोई आपसे कहता है "अभिव्यक्ति फू का मूल्य () खाली सेट का है" तो यह बहुत जानकारीपूर्ण है - यह बताता है कि यह अभिव्यक्ति कभी भी अपने सामान्य निष्पादन को पूरा नहीं करेगी; यह गर्भपात, फेंक या लटका देगा। यह इसके ठीक विपरीत है void
।
तो निम्नलिखित का कोई मतलब नहीं है (छद्म-सी ++, क्योंकि noreturn
प्रथम श्रेणी सी ++ प्रकार नहीं है)
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();
अफसोस की बात है कि C ++ इसकी अनुमति नहीं देता है, शायद व्यावहारिक कारणों से। इसके बजाय यह आपको [[ noreturn ]]
विशेषता का उपयोग करने की क्षमता देता है जो संकलक अनुकूलन और चेतावनी का मार्गदर्शन करने में मदद करता है।