Recentemente, surgiu uma revisão de código que, no exemplo a seguir:
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));
Deveríamos estar usando em sizeof(std::underlying_type<A>::type)
vez de sizeof(A)
. É possível que estes possam diferir? Alguém tem uma cotação de padrões que garanta isso?
c++
language-lawyer
Fantastic Mr Fox
fonte
fonte
sizeof(A)
? Além disso: se eles tiverem um tamanho diferente (improvável), o usosizeof(std::underlying_type<A>)
seria completamente errado.sizeof(std::underlying_type<A>)
é provavelmente1
. Você quis dizer::type
?A
s, definitivamente se deseja usarsizeof(A)
e o código não deve se importar com o tipo de tipoA
.Respostas:
No C ++ 03, era garantido (bem, para enumerações sem escopo, de qualquer maneira).
Depois veio o n2347 , o artigo que foi adotado para enumerações fortemente tipadas (
enum class
) e outros aprimoramentos para enumerações sem escopo, e teve a sentença em negrito removida. Curiosamente, uma versão anterior da proposta, n2213 , substituiu a sentença removida. Mas não entrou na versão adotada.Portanto, no C ++ moderno, não há obrigação de os tamanhos serem os mesmos. Embora do ponto de vista prático, é improvável que as implementações tenham alterado o comportamento prescrito pelo C ++ 03 para tamanhos de enumeração.
Pode-se considerar um defeito no padrão.
fonte
enum class
) é nova.