Récemment apparu dans une revue de code qui dans l'exemple suivant:
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));
Nous devrions utiliser sizeof(std::underlying_type<A>::type)
au lieu de sizeof(A)
. Est-il possible que ceux-ci puissent différer? Quelqu'un at-il un devis standard qui garantit cela?
c++
language-lawyer
Fantastique Mr Fox
la source
la source
sizeof(A)
? Aussi: si elles sont d'une taille différente (peu probable), l'utilisationsizeof(std::underlying_type<A>)
serait tout simplement fausse.sizeof(std::underlying_type<A>)
est probablement1
. Tu voulais dire::type
?A
s, on veut vraiment utilisersizeof(A)
et le code ne devrait pas se soucier de quel typeA
est.Réponses:
En C ++ 03, il était garanti (enfin, pour les énumérations non étendues de toute façon).
Puis vint n2347 , le document qui a été adopté pour les énumérations fortement typées (
enum class
) et d'autres améliorations aux énumérations non étendues, et la phrase en gras a été supprimée. Chose intéressante, une version antérieure de la proposition, n2213 , a remplacé la phrase supprimée. Mais cela n'a pas fait partie de la version qui a été adoptée.Donc, en C ++ moderne, il n'y a aucune obligation pour que les tailles soient les mêmes. Bien que d'un point de vue pratique, il est peu probable que les implémentations aient changé le comportement prescrit par C ++ 03 pour les tailles d'énumération.
On pourrait le considérer comme un défaut de la norme.
la source
enum class
) est nouvelle.