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


Durante una charla de la conferencia CppCon2014 de Walter E. Brown, afirma que hay 15 clasificaciones de tipos en C++ que el estándar describe.

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

¿Cuáles son los otros 14?


Mientras cavaba a través del estándar, encontré lo siguiente: {[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;

Hmm, eso es más de 15. Estos son rasgos de tipo de todos modos. Le se utilizan para probar ciertas propiedades de tipos en tiempo de compilación. Por ejemplo, un tipo integer devolvería true para is_integral, is_fundamental, y es is_scalar. Tal vez las 15 son algunas de las enumeradas anteriormente y el resto son subcategorías de otras.


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

introduzca la descripción de la imagen aquí

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, char, y enum son todos los tipos integrales, así que realmente no estoy muy seguro de esto lista.

Author: Trevor Hickey, 2014-11-20

1 answers

Hablé con Walter directamente, y fue simplemente un error de cálculo.

" Por desgracia, poco después me di cuenta de que había contado mal y por lo tanto cometido un error off-by-one durante la charla: hay 14 (no 15) clasificaciones de tipos. Ver la lista de categoría de tipo primario predicados en la cláusula [meta.unary.cat] en el estándar C++; estos corresponden a las clasificaciones establecidas para el lenguaje básico en [básica.tipo]."WEB WEB

Dicho esto, ellos 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;
 25
Author: Trevor Hickey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-20 07:52:15