2011-10-16 5 views
9

C++ 11 agrega clases enum, que son enums de tipado más fuerte: los valores de las clases enum no se convertirán implícitamente en valores de otras clases de enum o enteros, y las declaraciones de reenvío se permiten en virtud de un especificador de tamaño explícito.¿Puedo usar valores de clase enum como argumentos para funciones varargs?

¿Es posible pasar valores de tales enumeraciones a funciones varargs y permanecer dentro del comportamiento definido por las normas? ¿Dentro del comportamiento definido por la implementación?

+0

+1, buena pregunta ¡Necesito ver un borrador reciente para contestar eso! – Flexo

Respuesta

8

Sí, puedes. 5.2.2/7 permite explícitamente argumentos de cualquier tipo de enumeración. Los valores enum sin ámbito se promueven con enteros, pero las enumeraciones del ámbito (los enum class) no lo son.

Por supuesto, todavía debe tener cuidado en la implementación de la función.

+1

+1 para la referencia 5.2.2/7 - Estoy bastante seguro de que si 'enum class' estaba exenta de eso habría una nota ahí. – Flexo

+1

Me pregunto si es UB para usar el tipo subyacente con 'va_arg', cuando el argumento recuperado era un valor de enumeración con ámbito? Parece que es. –

+0

@Johannes: Si eso causa UB, ¿no derrota eso el propósito de especificar el tipo subyacente en primer lugar (representación del valor idéntico)? – ildjarn

1

Creo que la respuesta es que puede ser seguro:

VA_ARGS requiere argumentos para ser POD, que no ha cambiado en lo que yo sé.

no puedo ver ninguna razón por qué:

enum class foo { bar=1 }; 

no cumpliría los requisitos para POD-dad sin embargo.

0

Cuando deseche algún tipo de información cuando use varargs (es por eso que se desaconseja encarecidamente para los tipos que no sean POD), recibirá el tipo subyacente en el otro extremo de su varargs mediante la función. El valor predeterminado es int pero se puede cambiar eso (por ejemplo enum class MyEnum : char { ... };)

Corregido: varargs de hecho no lo hace tirar toda la información de tipo y si se utiliza los datos POD tipo que debe ser bastante segura.

+1

Eso no es realmente lo que dice la norma. No toda la información de tipo se descarta. –

+1

'int' como valor predeterminado solo es verdadero para las enumeraciones con ámbito (que están en discusión aquí después de todo). –

+0

@ AlanStokes: Gracias. Intenté enmendar mi declaración anterior en negrita. – Florian

Cuestiones relacionadas