Recientemente apareció en una revisión de código que en el siguiente ejemplo:
enum class A : uint8_t
{
VAL1, VAL2
};
...
std::vector<A> vOfA; // Assume this is sized and full of some stuff.
std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A));
Deberíamos estar usando en sizeof(std::underlying_type<A>::type)
lugar de sizeof(A)
. ¿Es posible que estos puedan ser diferentes? ¿Alguien tiene una cita estándar que garantice esto?
c++
language-lawyer
Fantástico Sr. Fox
fuente
fuente
sizeof(A)
? Además: si tienen un tamaño diferente (poco probable), el usosizeof(std::underlying_type<A>)
sería simplemente incorrecto.sizeof(std::underlying_type<A>)
es probablemente1
. Quiso decir::type
?A
s, uno definitivamente quiere usarsizeof(A)
y el código no debería importar qué tipo de tipoA
es.Respuestas:
En C ++ 03 estaba garantizado (bueno, para enumeraciones sin ámbito de todos modos).
Luego vino n2347 , el documento que se adoptó para las enumeraciones fuertemente tipadas (
enum class
) y otras mejoras a las enumeraciones sin ámbito, y tenía la oración en negrita eliminada. Curiosamente, una versión anterior de la propuesta, n2213 , tenía un reemplazo para la oración eliminada. Pero no se convirtió en la versión que se adoptó.Entonces, en C ++ moderno, no hay obligación de que los tamaños sean los mismos. Aunque desde un punto de vista práctico, es poco probable que las implementaciones hayan cambiado el comportamiento prescrito por C ++ 03 para los tamaños de enumeración.
Se podría considerar un defecto en el estándar.
fuente
enum class
) es nueva.