최근에 다음 예제에서 코드 검토를 수행했습니다.
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 ++ 03에서는 범위가 지정되지 않은 열거의 경우 보장되었습니다.
[dcl.enum] 열거 선언 (강조 광산)
6 열거의 기본 형식은 열거에 정의 된 모든 열거 자 값을 나타낼 수있는 정수 형식입니다. 정수 유형이 모든 열거 자 값을 나타낼 수없는 경우 열거는 잘못된 형식입니다. 열거 자의 값이 int 또는 unsigned int에 맞지 않는 한 기본 유형이 int보다 크지 않아야한다는 점을 제외하고 열거에 대한 기본 유형으로 사용되는 정수 유형이 구현 정의되어 있습니다. 열거 목록이 비어있는 경우, 열거가 0 값을 갖는 단일 열거 한 것처럼 기본 유형이 값
sizeof()
열거 타입 열거 타입의 객체 또는 열거인가를,의 값sizeof()
에인가는 기본 유형 .
그런 다음 강력한 형식의 열거 ( ) 및 범위가 지정되지 않은 열거에 대한 기타 개선 사항 에 채택 된 논문 인 n2347 이 나오고enum class
굵게 표시된 문장이 제거되었습니다. 흥미롭게도 이전 버전의 제안 인 n2213 은 삭제 된 문장을 대체했습니다. 그러나 채택 된 버전으로 만들지 않았습니다.
따라서 현대 C ++에서는 크기가 동일해야 할 의무가 없습니다. 실제적인 관점에서 볼 때 구현이 열거 크기에 대해 C ++ 03에서 규정 한 동작을 변경하지는 않았습니다.
표준의 결함으로 간주 될 수 있습니다.