Недавно появился обзор кода, который в следующем примере:
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));
Мы должны использовать sizeof(std::underlying_type<A>::type)
вместо sizeof(A)
. Возможно ли, что они могут отличаться? У кого-то есть стандартная цитата, которая гарантирует это?
c++
language-lawyer
Фантастический мистер Фокс
источник
источник
sizeof(A)
? Кроме того: если они имеют другой размер (маловероятно), использованиеsizeof(std::underlying_type<A>)
будет просто неправильно.sizeof(std::underlying_type<A>)
это наверное1
. Вы имели в виду::type
?A
s, определенно хочется использовать,sizeof(A)
и коду не должно быть никакого значения, что это за типA
.Ответы:
В C ++ 03 это было гарантировано (ну, для перечислений с незаданной областью в любом случае).
Затем появился n2347 , документ, который был принят для строго типизированных перечислений (
enum class
) и других улучшений перечислений с незаданной областью, и в нем было удалено предложение, выделенное жирным шрифтом. Интересно, что более ранняя версия предложения, n2213 , заменяла удаленное предложение. Но это не вошло в версию, которая была принята.Таким образом, в современном C ++ нет необходимости, чтобы размеры были одинаковыми. Хотя с практической точки зрения реализации вряд ли изменили поведение, предписанное C ++ 03 для размеров перечисления.
Можно было бы считать это недостатком стандарта.
источник
enum class
) с областью видимости ( ) является новым.