Gõ theo lý thuyết, void
là những gì được gọi trong các ngôn ngữ khác unit
hoặc top
. Tương đương logic của nó là True . Bất kỳ giá trị nào cũng có thể được sử dụng một cách hợp pháp void
(mỗi loại là một kiểu con void
). Hãy nghĩ về nó như "vũ trụ" được thiết lập; không có hoạt động chung cho tất cả các giá trị trên thế giới, vì vậy không có hoạt động hợp lệ trên một giá trị loại void
. Nói cách khác, nói với bạn rằng một cái gì đó thuộc về vũ trụ không cung cấp cho bạn bất kỳ thông tin nào - bạn đã biết nó rồi. Vì vậy, sau đây là âm thanh:
(void)5;
(void)foo(17); // whatever foo(17) does
Nhưng bài tập dưới đây không phải là:
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]]
Mặt khác, được gọi là đôi khi empty
, Nothing
, Bottom
hay Bot
và là tương đương logic của False . Nó không có giá trị nào cả, và một biểu thức của loại này có thể được chuyển thành (tức là kiểu con của) bất kỳ loại nào. Đây là bộ trống. Lưu ý rằng nếu ai đó nói với bạn "giá trị của biểu thức foo () thuộc về tập hợp trống" thì nó có nhiều thông tin - nó cho bạn biết rằng biểu thức này sẽ không bao giờ hoàn thành việc thực hiện bình thường; Nó sẽ hủy bỏ, ném hoặc treo. Nó là hoàn toàn ngược lại void
.
Vì vậy, những điều sau đây không có ý nghĩa (pseudo-C ++, vì noreturn
không phải là loại C ++ hạng nhất)
void foo();
(noreturn)5; // obviously a lie; the expression 5 does "return"
(noreturn)foo(); // foo() returns void, and therefore returns
Nhưng bài tập dưới đây là hoàn toàn hợp pháp, throw
do trình biên dịch hiểu là không trả về:
void f(int y) {
int x = y!=0 ? 100/y : throw exception();
cout << x << endl;
}
Trong một thế giới hoàn hảo, bạn có thể sử dụng noreturn
làm giá trị trả về cho hàm raise()
trên:
noreturn raise() { throw exception(); }
...
int x = y!=0 ? 100/y : raise();
Đáng buồn là C ++ không cho phép nó, có lẽ vì lý do thực tế. Thay vào đó, nó cung cấp cho bạn khả năng sử dụng [[ noreturn ]]
thuộc tính giúp hướng dẫn tối ưu hóa và cảnh báo trình biên dịch.