c++ - resueltos - Punto de declaración para una enumeración.
problemas con estructuras c++ (1)
El seguimiento;
enum class E : CL<E>::UndType;
No se acepta como una declaración válida en algunas implementaciones actuales (clang ++, g ++ y MSVC probados). No aceptan el tipo E
, aún incompleto, en el CL<E>::UndType
en la base de enumeración CL<E>::UndType
. El error que se da en las implementaciones probadas es que E
no está declarada en ese momento. Parece que colocan el punto de declaración al final de la base de enumeración , lo consideran declarado una vez que está completo.
Al leer las especificaciones;
§14.3.1 / 2 Argumentos de tipo de plantilla
[Nota: un argumento de tipo de plantilla puede ser un tipo incompleto (3.9). - nota final]
Y
§7.2 / 6 Declaraciones de enumeración
Una enumeración cuyo tipo subyacente es fijo es un tipo incompleto desde su punto de declaración (3.3.2) hasta inmediatamente después de su enum-base (si corresponde), en cuyo punto se convierte en un tipo completo.
Lo insinúa que es compilable; Como es el caso de las implementaciones de CRTP.
Estoy seguro de que si esto (es decir, la falta de compilación de enum class E : CL<E>::UndType;
) es la intención o si se consideró como un caso de uso. A partir de la especificación, a la declaración de enumeración opaca se le da un tratamiento "especial" con su tipo de base y el requisito de que sea un tipo integral.
Presumiblemente, el código debe ser compilable dada la resolución a open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1482 .
En cuanto a las soluciones actuales ...
Esta;
enum class E; // default underlying type is int
Es la declaración mínima.
La declaración opaca podría ser cualquiera;
enum class E : int; // int base
La siguiente sería una definición completa (incluidos los enumeradores);
enum class E : int {/*...*/};
O para usar la plantilla de clase, se podría usar otro tipo (posiblemente void
).
enum class E : CL<void>::UndType;
¿Cuál es el punto de declaración de tipos de enumeración? ¿Es inmediatamente después del nombre de una enumeración? Vi el estándar C ++ 14 (n4296) §3.3.2 / 3:
El punto de declaración para una enumeración es inmediatamente después del identificador (si existe) en su especificador de enumeración (7.2) o su primera declaración de enumeración opaca (7.2), lo que ocurra primero
Pero cuando intento reproducirlo;
template <class T>
struct CL
{
using UndType = int;
};
enum class E: CL<E>::UndType; //error: E is undefined
He recibido un error en todos los compiladores, aunque la enum-base para la enumeración E
se coloca después del identificador y debe estar visible.