std::is_void (header <type_traits>) kiểm tra xem kiểu T có phải là void hay không (bao gồm void, const void, volatile void, const volatile void).
Cú pháp
template <class T> struct is_void;
Ví dụ kiểm tra
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "Kiểm tra is_void:\n";
cout << "void: " << is_void<void>::value << '\n'; // true
cout << "const void: " << is_void<const void>::value << '\n'; // true
cout << "volatile void: " << is_void<volatile void>::value << '\n'; // true
cout << "const volatile void: " << is_void<const volatile void>::value << '\n'; // true
cout << "int: " << is_void<int>::value << '\n'; // false
cout << "char: " << is_void<char>::value << '\n'; // false
cout << "double: " << is_void<double>::value << '\n'; // false
cout << "float: " << is_void<float>::value << '\n'; // false
cout << "int*: " << is_void<int*>::value << '\n'; // false
cout << "void*: " << is_void<void*>::value << '\n'; // false (con trỏ void, không phải void)
return 0;
}
Đầu ra
Kiểm tra is_void: void: true const void: true volatile void: true const volatile void: true int: false char: false double: false float: false int*: false void*: false
Ý nghĩa của void
- Void type: "Rỗng", "không có giá trị". Dùng cho hàm không trả về giá trị.
- Void pointer (void*): Con trỏ chung, có thể trỏ đến bất kỳ kiểu object nào. Phải ép kiểu trước khi dereference.
is_voidchỉ true cho chính kiểuvoid(với cv-qualifier), KHÔNG chovoid*.
Ứng dụng
- Template metaprogramming: Đặc biệt hóa cho void type.
- SFINAE:
enable_if_t<!is_void_v<T>>để loại trừ void. - Type traits composition: Kết hợp với
is_function,is_object.
Mối quan hệ
is_void → true chỉ cho void, const void, volatile void, const volatile void
is_object → true cho mọi object type (non-function, non-reference, non-void)
is_function → true cho function type
// Phân vùng: void, function, object (scalar, array, class, union)
Lưu ý
voidlà incomplete type - không thể khai báo biến kiểu void, không thể sizeof(void).- Dùng
voidlàm return type, parameter type (chỉ trong template), hoặc pointer target.