Jenis berbicara secara teoritis, voidadalah apa yang disebut dalam bahasa lain unitatau top. Setara logisnya adalah Benar . Nilai apa pun dapat dilemparkan ke void(setiap jenis adalah subtipe dari void) secara sah . Pikirkan itu sebagai set "semesta"; tidak ada operasi yang sama untuk semua nilai di dunia, jadi tidak ada operasi yang valid pada nilai tipe void. Dengan kata lain, memberi tahu Anda bahwa sesuatu milik alam semesta tidak memberi Anda informasi apa pun - Anda sudah mengetahuinya. Jadi yang berikut adalah suara:
(void)5;
(void)foo(17); // whatever foo(17) does
Namun tugas di bawah ini bukan:
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]], Di sisi lain, disebut kadang-kadang empty, Nothing, Bottomatau Botdan adalah setara logis dari False . Tidak memiliki nilai sama sekali, dan ekspresi tipe ini dapat dilemparkan ke (yaitu subtipe dari) tipe apa pun. Ini adalah set kosong. Perhatikan bahwa jika seseorang memberi tahu Anda "nilai ekspresi foo () milik set kosong" itu sangat informatif - ia memberi tahu Anda bahwa ungkapan ini tidak akan pernah menyelesaikan eksekusi normalnya; itu akan membatalkan, melempar atau menggantung. Ini adalah kebalikan dari void.
Jadi yang berikut ini tidak masuk akal (pseudo-C ++, karena noreturnbukan tipe C ++ kelas satu)
void foo();
(noreturn)5; // obviously a lie; the expression 5 does "return"
(noreturn)foo(); // foo() returns void, and therefore returns
Tetapi penugasan di bawah ini benar-benar sah, karena throwdipahami oleh kompiler untuk tidak kembali:
void f(int y) {
int x = y!=0 ? 100/y : throw exception();
cout << x << endl;
}
Di dunia yang sempurna, Anda bisa menggunakan noreturnsebagai nilai balik untuk fungsi di raise()atas:
noreturn raise() { throw exception(); }
...
int x = y!=0 ? 100/y : raise();
Sayangnya C ++ tidak memungkinkan, mungkin karena alasan praktis. Sebaliknya itu memberi Anda kemampuan untuk digunakan[[ noreturn ]] atribut yang membantu membimbing optimasi dan peringatan kompiler.