Подтвердить что ты не робот

Каковы 15 классификаций типов в С++?

Во время беседы конференции CppCon2014 от Вальтера Э. Брауна он утверждает, что существует 15 классификаций типов в С++, который описан в стандарте.

"15 разделов вселенной типов С++."
" void является одним из них". - Уолтер Э. Браун.

Каковы остальные 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 вернет значение true для is_integral, is_fundamental и будет is_scalar. Возможно, 15 из них перечислены выше, а остальные - подкатегории другим.


Здесь моя попытка попытаться создать дерево типов языка:

enter image description here

Мое предположение:

 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 являются целыми типами, поэтому я действительно не очень уверен в этом списке.

4b9b3361

Ответ 1

Я говорил с Уолтером напрямую, и это было просто ошибкой.

"Увы, я вскоре понял, что я ошибся и, следовательно, во время разговора совершена ошибка" один за другим ": есть 14 (не 15) типа. См. Список категорий первичного типа предикаты в разделе [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;