Pregunta ¿Cuáles son las 15 clasificaciones de tipos en C ++?


Durante un Charla de la conferencia CppCon2014 por Walter E. Brown, él dice que hay 15 clasificaciones de tipos en C ++ que describe el estándar.

"15 particiones del universo de tipos de C ++".
"vacío es uno de ellos. "- Walter E. Brown.

¿Cuáles son los otros 14?


Mientras exploraba el estándar, encontré lo siguiente:

// 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;

Hmm, eso es más de 15. Estos son rasgos de tipo de todos modos. Se usan para probar ciertas propiedades de tipos en tiempo de compilación. Por ejemplo, un integer tipo devolvería verdadero para is_integral, is_fundamental, y es is_scalar. Quizás los 15 son algunos de los enumerados anteriormente y el resto son subcategorías de otros.


Aquí está mi intento de tratar de hacer un árbol de tipos del lenguaje:

enter image description here 

Mi conjetura:

 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

Pero también tenga en cuenta que bool, chary enum son todos tipos integrales, así que no estoy muy seguro de esta lista.


27
2017-11-20 06:00


origen


Respuestas:


Hablé con Walter directamente, y fue simplemente un error.

"Ay, me di cuenta poco después de que había contado mal y por lo tanto   cometió un error "off-by-one" durante la conversación: hay 14 (no 15)   clasificaciones de tipo. Ver la lista de categoría de tipo primario   predicados en la cláusula [meta.unary.cat] en el estándar de C ++; estas   corresponden a las clasificaciones establecidas para el lenguaje central en   [basic.types]. "--WEB

Dicho esto, son:

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;

23
2017-11-20 07:40