【发布时间】:2026-01-21 00:45:01
【问题描述】:
在 Walter E. Brown 的 CppCon2014 conference talk 中,他指出标准描述的 C++ 中有 15 种分类。
“C++ 类型世界的 15 个分区。”
“void就是其中之一。” ——沃尔特·E·布朗。
其他 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都是整数类型,所以我对这个列表真的不是很自信。
【问题讨论】:
-
也许你应该问问 Walter E. Brown?无论他在说什么,C++ 语言规范中都没有具体说明。
-
功能?总计的 ?豆荚?极值?左值?字面意思?常量表达式? ....
-
Fwiw,这是我关于这个主题的图表:howardhinnant.github.io/TypeHiearchy.pdf
-
@HowardHinnant:非常好 :) 我正在保存它!但是我看到它可以追溯到 2007 年,您是否愿意为可能的表达式类型添加 Stroustrup 的 W 分类? (glvalue, rvalue, lvalue, xvalue)。
constexpr也没有出现。也许在大的一个气泡中划分积分(有符号/无符号/字符)?同样在任何情况下,是否可以对这些类型中的任何一种进行 CV 限定?
标签: c++ c++11 types classification categories