Kürzlich kam in einer Codeüberprüfung, die im folgenden Beispiel:
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));
Wir sollten sizeof(std::underlying_type<A>::type)
anstelle von verwenden sizeof(A)
. Ist es möglich, dass sich diese jemals unterscheiden können? Hat jemand ein Standardangebot, das dies garantiert?
c++
language-lawyer
Fantastischer Mr. Fox
quelle
quelle
sizeof(A)
? Außerdem: Wenn sie eine andere Größe haben (unwahrscheinlich),sizeof(std::underlying_type<A>)
wäre die Verwendung einfach falsch.sizeof(std::underlying_type<A>)
ist wahrscheinlich1
. Meinten Sie::type
?A
s beschäftigt, möchte man definitiv verwendensizeof(A)
und der Code sollte sich nicht darum kümmern, was für ein Typ esA
ist.Antworten:
In C ++ 03 war dies garantiert (na ja, für Aufzählungen ohne Gültigkeitsbereich sowieso).
Dann kam n2347 , das Papier, das für stark typisierte Aufzählungen (
enum class
) und andere Verbesserungen an nicht abgedeckten Aufzählungen übernommen wurde, und der fett gedruckte Satz wurde entfernt. Interessanterweise hatte eine frühere Version des Vorschlags, n2213 , einen Ersatz für den entfernten Satz. Aber es wurde nicht in die Version aufgenommen, die übernommen wurde.In modernem C ++ besteht daher keine Verpflichtung, dass die Größen gleich sind. Aus praktischer Sicht ist es jedoch unwahrscheinlich, dass Implementierungen das von C ++ 03 für Aufzählungsgrößen vorgeschriebene Verhalten geändert haben.
Man könnte es als einen Defekt in der Norm betrachten.
quelle
enum class
) mit Gültigkeitsbereich ist neu.