sizeof (enum)이 sizeof (std :: underlying_type <Enum> :: type)과 다를 수 있습니까?


16

최근에 다음 예제에서 코드 검토를 수행했습니다.

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에서 열거 형 데이터의 크기 무엇인지? (이것은 범위가있는 것들도 포함해야합니다 :-).
Acorn

3
크기가 같더라도 (경우보다 더 큽니다) sizeof(A)? 또한 : 크기가 다르면 ( sizeof(std::underlying_type<A>)아마도 ) 사용하는 것이 잘못되었습니다.
Sander De Dycker

1
sizeof(std::underlying_type<A>)아마입니다 1. 당신은 의미 했습니까 ::type?
LF

1
@SanderDeDycker 그래, As를 다룰 때 , 분명히 사용 sizeof(A)하고 싶고 코드는 어떤 종류의 유형을 신경 쓰지 않아야합니다 A.
Acorn

@LF 그래, 오타. 제목이 맞았습니다.
환상적인 미스터 폭스

답변:


12

C ++ 03에서는 범위가 지정되지 않은 열거의 경우 보장되었습니다.

[dcl.enum] 열거 선언 (강조 광산)

6 열거의 기본 형식은 열거에 정의 된 모든 열거 자 값을 나타낼 수있는 정수 형식입니다. 정수 유형이 모든 열거 자 값을 나타낼 수없는 경우 열거는 잘못된 형식입니다. 열거 자의 값이 int 또는 unsigned int에 맞지 않는 한 기본 유형이 int보다 크지 않아야한다는 점을 제외하고 열거에 대한 기본 유형으로 사용되는 정수 유형이 구현 정의되어 있습니다. 열거 목록이 비어있는 경우, 열거가 0 값을 갖는 단일 열거 한 것처럼 기본 유형이 sizeof()열거 타입 열거 타입의 객체 또는 열거인가를,의 값 sizeof()에인가는 기본 유형 .

그런 다음 강력한 형식의 열거 ( ) 및 범위가 지정되지 않은 열거에 대한 기타 개선 사항 에 채택 된 논문 인 n2347나오고enum class 굵게 표시된 문장이 제거되었습니다. 흥미롭게도 이전 버전의 제안 인 n2213 은 삭제 된 문장을 대체했습니다. 그러나 채택 된 버전으로 만들지 않았습니다.

따라서 현대 C ++에서는 크기가 동일해야 할 의무가 없습니다. 실제적인 관점에서 볼 때 구현이 열거 크기에 대해 C ++ 03에서 규정 한 동작을 변경하지는 않았습니다.

표준의 결함으로 간주 될 수 있습니다.


2
C ++ 03에서 언어에없는 기능에 대해 어떻게 보장 할 수 있습니까? oO
궤도에서 가벼움 경주

4
@LightnessRaceswithMonica-기본 유형의 개념은 새로운 것이 아닙니다. C ++ 11을 사용하면 직접 지정할 수 있습니다.
StoryTeller-Unslander Monica 2009 년

나도 알아 범위가 지정된 열거 형 ( enum class) 의 개념 은 새로운 것입니다.
궤도에서 가벼움 경주

@LightnessRaceswithMonica-잠재적으로 제안을 잘못 할 수 있다고 생각합니다. 두 가지 작업을 수행하여 범위 열거를 도입했으며 범위 열거뿐만 아니라 모든 열거에 기본 유형 세트를 허용했습니다. 따라서 C ++ 03의 "보장".
StoryTeller-Unslander Monica 2009 년

1
@ StoryTeller-UnslanderMonica 예, 질문은 범위, 범위 또는 범위가 다르다고 생각합니다.
환상적인 미스터 폭스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.