Niedawno pojawił się w przeglądzie kodu, który w następującym przykładzie:
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));
Powinniśmy używać sizeof(std::underlying_type<A>::type)
zamiast sizeof(A)
. Czy to możliwe, że mogą się one kiedykolwiek różnić? Czy ktoś ma ofertę cenową, która to gwarantuje?
c++
language-lawyer
Fantastyczny Mr Fox
źródło
źródło
sizeof(A)
? Ponadto: jeśli mają inny rozmiar (mało prawdopodobne), użyciesizeof(std::underlying_type<A>)
byłoby po prostu złe.sizeof(std::underlying_type<A>)
jest prawdopodobnie1
. Miałeś na myśli::type
?A
s, zdecydowanie chcemy używać,sizeof(A)
a kod nie powinien przejmować się, jakiego rodzajuA
jest typ .Odpowiedzi:
W C ++ 03 było to gwarantowane (cóż, w każdym razie dla nieposkulonych wyliczeń).
Potem n2347 , papier, który został przyjęty do silnie typowanych wyliczeń (
enum class
) i innych ulepszeń do nieskalowanych wyliczeń, i miał pogrubione zdanie. Co ciekawe, wcześniejsza wersja wniosku, n2213 , zastąpiła usunięte zdanie. Ale nie pasowało to do przyjętej wersji.Tak więc we współczesnym C ++ nie ma obowiązku, aby rozmiary były takie same. Chociaż z praktycznego punktu widzenia implementacje raczej nie zmieniły zachowania określonego przez C ++ 03 dla wielkości wyliczeń.
Można uznać to za wadę standardu.
źródło
enum class
) jest nowe.