Jenis berbicara secara teoritis, void
adalah apa yang disebut dalam bahasa lain unit
atau 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
, Bottom
atau Bot
dan 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 noreturn
bukan 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 throw
dipahami 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 noreturn
sebagai 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.