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 ++での列挙型データのサイズとのリンク (スコープ指定されたものもカバーするように作成する必要があります:-)。
ドングリ

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
ドングリ

@LFうん、タイプミス。タイトルは正しかった。
Fantastic Mr Fox

回答:


12

C ++ 03では保証されていました(とにかく、スコープのない列挙型の場合)。

[dcl.enum] 列挙宣言(強調鉱山)

6列挙型の基になる型は、列挙型で定義されているすべての列挙子の値を表すことができる整数型です。すべての列挙子の値を表すことができる整数型がない場合、列挙型の形式が正しくありません。列挙型の値がintまたはunsigned intに収まらない場合を除いて、基になる型がintより大きくならないことを除いて、どの整数型が列挙の基になる型として使用されるかは実装定義です。enumerator-listが空の場合、基になるタイプは、列挙型に値0 sizeof()sizeof()単一の列挙子があるかのようになります。列挙型適用される、列挙型のオブジェクト、または列挙子は、基になるタイプ

その後、厳密に型指定された列挙()およびスコープ外の列挙に対するenum classその他の機能強化に採用されたn2347登場し、太字の文が削除されました。興味深いことに、以前のバージョンの提案n2213には、削除された文の代わりがありました。しかし、採用されたバージョンにはなりませんでした。

したがって、最新のC ++では、サイズを同じにする必要はありません。実用的な観点からは、実装が列挙サイズのC ++ 03で規定された動作を変更することはほとんどありません。

規格の欠陥と見なすことができます。


2
言語に存在しない機能について、C ++ 03で何かが保証されたのはなぜですか?oO
にオービットの軽量レース

4
@LightnessRaceswithMonica-基礎となる型の概念は新しいものではありません。C ++ 11で自分で指定できるようになっただけです。
StoryTeller-Unslander Monica

そんなこと知ってる。スコープ付き列挙型(enum class)の概念は新しいものです。
オービットのライトネスレース

@LightnessRaceswithMonica-ここで提案を失敗させる可能性があると思います。これは2つのことを行い、スコープ付き列挙を導入し、スコープ付き列挙だけでなくすべての列挙に基礎となる型セットを許可しました。したがって、C ++ 03では「保証」されています。
StoryTeller-Unslander Monica

1
@ StoryTeller-UnslanderMonicaええ、質問は私が考える範囲と同じか、範囲外かです。
Fantastic Mr Fox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.