【问题标题】:What are the 15 classifications of types in C++?C++中的15种类型分类是什么?
【发布时间】: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_integralis_fundamentalis_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

但还要注意boolcharenum都是整数类型,所以我对这个列表真的不是很自信。

【问题讨论】:

  • 也许你应该问问 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


【解决方案1】:

我直接与沃尔特交谈,这简直是误算了。

“唉,不久之后我意识到我算错了,因此 在谈话中犯了一个错误:有 14 个(不是 15 个) 类型分类。查看主要类型类别列表 C++ 标准中子句 [meta.unary.cat] 中的谓词;这些 对应于为核心语言建立的分类 [basic.types]。” --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;

【讨论】:

    最近更新 更多