namespace ValueType {
enum Enum {
Boolean = 0,
Float = 1,
Double,
SInt = 8,
SLong,
UInt = SInt + (1 <<4),
ULong = SLong + (1 << 4)
};
}
Respuesta
Sí, el requisito es que sea una expresión de constante integral. estándar El C++ incluye el siguiente ejemplo:
enum { d, e, f=e+2 };
Cuando vi su respuesta y la anterior de Pavel, inmediatamente me acordé de la potenciación y la metaprogramación, ¿cómo no recuerdo eso? heh. Gracias. :) – Geoff
Incluso es posible usar booleanos: ** enum {yes = true, no =! Yes}; ** – fmuecke
Sí, de acuerdo con las reglas de C++, los * tipos integrales * incluyen "bool, char, wchar_t, los tipos enteros con signo y sin signo "y" bool values se comportan como tipos integrales ". –
Como se ha señalado por Jerry, es legal.
En algunos casos excepcionales, es consciente de que el tipo de enumeradores solo se especifica después de que la enumeración esté completamente definida. El estándar dice lo siguiente sobre el tipo de las enumeraciones (7.2/4):
Cada enumeración define un tipo que es diferente de todos los demás tipos. Después del paréntesis de cierre de un enumerador de especificación, cada enumerador tiene el tipo de su enumeración. Antes del cierre de llave, el tipo de cada enumerador es el tipo de su valor de inicialización. Si se especifica un inicializador para un enumerador, el valor de inicialización tiene el mismo tipo que la expresión. Si no se especifica ningún inicializador para el primer enumerador, el tipo es un tipo integral no especificado. De lo contrario, el tipo es el mismo que el tipo del valor de inicialización del enumerador anterior a menos que el valor incrementado no sea representable en ese tipo, en cuyo caso el tipo es un tipo integral no especificado suficiente para contener el valor incrementado.
La sentencia de relieve se pueden mostrar en el siguiente ejemplo:
enum E {
E0 // Unspecified type
, E1 = E0-1 // -1, or MAX_UINT
, E2 // 0 or (MAX_UINT+1)
};
Básicamente, el tipo elegido para E0
afecta el valor resultante de E1
.
Comprensible y lógico, no veo por qué alguien evitaría dar un valor inicial sin embargo. Hacer eso sin sentido lo pone a merced de la implementación del compilador. Caso en punto; en MSVC 2008, su E produce: E0 (0), E1 (-1), E2 (0). – Geoff
Como con todo este tipo de comportamiento, las personas a veces solo asumen que el compilador hará lo que es razonable. Y, por supuesto, lo sensato es * lo * que esperan que suceda. –
- 1. Definición de los miembros estáticos en C++
- 2. Orden de campos miembros en Enum
- 3. Enum vs no miembros discriminado unión
- 4. Uso de los miembros de referencia rvalue?
- 5. Enum (flags) miembro compuesto por otros miembros
- 6. ¿Qué AttributeTarget debería usar para los miembros de enum?
- 7. ¿Pueden los miembros de std :: forward_list implementarse como estáticos?
- 8. inspeccionar.obtener miembros en orden?
- 9. ¿Cierres como miembros de la clase?
- 10. Use doxygen para documentar los miembros de una estructura c fuera de la definición de estructura
- 11. Definición de miembros enteros const enteros en la definición de clase
- 12. Miembros de clase ambiguos en vb.net
- 13. ¿Cómo mostrar los miembros del tipo Enum en un DataGridViewComboBox?
- 14. Miembros estáticos de una clase de instancia
- 15. Enumeración de dos miembros vs. valor booleano
- 16. miembros de enumeración de tipo Int32
- 17. ¿Es posible recorrer los miembros de una clase en java?
- 18. Bloqueo de miembros estáticos de una clase
- 19. ¿Es posible obtener los nombres y valores de los miembros de una enumeración en D?
- 20. Uso de la expresión idiomática "espacio de miembros"?
- 21. ¡No se pueden recuperar los miembros enum en el orden en que se han definido!
- 22. El uso de una clase con miembros de datos const en un vector
- 23. Inicialización de miembros de datos estáticos
- 24. Exponer objetos de miembros como propiedades o métodos en .NET
- 25. Mantener citas como miembros de la tupla en Factor
- 26. El uso de LINQ para seleccionar un rango de miembros en una lista
- 27. miembro de referencia como miembros de la clase
- 28. ¿Cuál es el uso de ^: dinámico en una definición?
- 29. Miembros de clase estáticos python
- 30. Miembros protegidos de otras instancias en Scala
Ni siquiera sabía que era LEGAL ... bueno –
No es realmente autorreferencial. Tiene algunos miembros que hacen referencia a miembros previamente definidos. Las reglas aquí son normales: una vez que está definido, es visible. –
Actualicé la pregunta para reflejar su punto. Gracias. :) – Geoff