c ++ 11 — Каковы 15 классификаций типов в C ++?

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

«15 разделов вселенной типов C ++».
«недействительным является одним из них. «- Уолтер Э. Браун.

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

29

Решение

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

«Увы, вскоре после этого я понял, что ошибся
во время разговора допущена ошибка: 14 (не 15)
классификация типов. Смотрите список основных типов категории
предикаты в предложении [meta.unary.cat] в стандарте C ++; эти
соответствуют классификациям, установленным для основного языка в
[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;
26

Другие решения


По вопросам рекламы [email protected]