programas - tipos de datos derivados en c++
¿Cuáles son las 15 clasificaciones de tipos en C++? (1)
Hablé con Walter directamente, y fue simplemente un error.
"Lamentablemente, poco después me di cuenta de que había cometido un error de cuenta y, por lo tanto, cometí un error de uno por uno durante la conversación: hay 14 (no 15) clasificaciones de tipo. Consulte la lista de predicados de categoría de tipo primario 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;
Durante una charla de conferencia de CppCon2014 por Walter E. Brown, afirma que hay 15 clasificaciones de tipos en C ++ que la norma describe.
"15 particiones del universo de tipos C ++".
"El vacío es uno de ellos". - Walter E. Brown.
¿Cuáles son los otros 14?
Mientras revisaba 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 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
. Quizás los 15 son algunos de los enumerados anteriormente y el resto son subcategorías a otros.
Aquí está mi intento de intentar hacer un árbol tipográfico del lenguaje:
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 tipos integrales, por lo que realmente no tengo mucha confianza en esta lista.