তাত্ত্বিকভাবে বলতে গেলে টাইপ করুন, 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
।
সুতরাং নিম্নলিখিতটি কোনও তাত্পর্যপূর্ণ নয় (ছদ্ম-সি ++, যেহেতু 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();
দুঃখের বিষয়, সম্ভবত ব্যবহারিক কারণে সি ++ এটি অনুমতি দেয় না। পরিবর্তে এটি আপনাকে [[ noreturn ]]
অ্যাট্রিবিউট ব্যবহার করার ক্ষমতা দেয় যা সংকলক অপ্টিমাইজেশন এবং সতর্কতাগুলিকে গাইড করতে সহায়তা করে।