在Walter E. Brown的CppCon2014 conference talk期间,他表示标准中描述的C ++中有 15个类型类型。
“C ++类型宇宙的15个分区。”
“无效就是其中之一。” - Walter E. Brown。
其他14个是什么?
在深入挖掘标准时,我发现了以下内容:
// 20.11.4.1
primary type categories:
template <class T> struct is_void;
template <class T> struct is_integral;
template <class T> struct is_floating_point;
template <class T> struct is_array;
template <class T> struct is_pointer;
template <class T> struct is_lvalue_reference;
template <class T> struct is_rvalue_reference;
template <class T> struct is_member_object_pointer;
template <class T> struct is_member_function_pointer;
template <class T> struct is_enum;
template <class T> struct is_union;
template <class T> struct is_class;
template <class T> struct is_function;
// 20.11.4.2
composite type categories:
template <class T> struct is_reference;
template <class T> struct is_arithmetic;
template <class T> struct is_fundamental;
template <class T> struct is_object;
template <class T> struct is_scalar;
template <class T> struct is_compound;
template <class T> struct is_member_pointer;
嗯,那超过15.无论如何,这些都是类型特征。它们用于在编译时测试类型的某些属性。例如,integer
类型会对is_integral
,is_fundamental
和is_scalar
返回true。也许这15个是上面列出的一些,其余的是其他的子类别。
这是我尝试制作该语言的类型树的尝试:
我的猜测:
1. void
2. bool
3. char
4. nullptr
5. integral (signed)
6. integral (unsigned)
7. floating
8. enum
9. array
10. class
11. union
12. lvalue reference
13. rvalue reference
14. member object pointer
15. member function pointer
但请注意,bool
,char
和enum
都是完整的类型,因此我对此列表并不十分自信。
答案 0 :(得分:27)
我直接与沃尔特谈过,这只是一个错误的计算。
&#34;唉,此后不久我意识到我错了,因此 在谈话中犯了一个错误的错误:有14个(不是15个) 类型分类。请参阅主要类型类别列表 C ++标准中的[meta.unary.cat]子句中的谓词;这些 对应于为核心语言建立的分类 [basic.types]&#34。 --web
话虽如此,他们是:
template <class T> struct is_void;
template <class T> struct is_null_pointer; //<- arrived in C++11 (std::nullptr_t)
template <class T> struct is_integral;
template <class T> struct is_floating_point;
template <class T> struct is_array;
template <class T> struct is_pointer;
template <class T> struct is_lvalue_reference;
template <class T> struct is_rvalue_reference;
template <class T> struct is_member_object_pointer;
template <class T> struct is_member_function_pointer;
template <class T> struct is_enum;
template <class T> struct is_union;
template <class T> struct is_class;
template <class T> struct is_function;