Sizeof (enum) sizeof'den farklı olabilir mi (std :: underlying_type <Enum> :: type)?


16

Son zamanlarda aşağıdaki örnekte bir kod incelemesi geldi:

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)Bunun yerine kullanmalıyız sizeof(A). Bunların hiç değişebilmesi mümkün müdür? Birisi bunu garanti eden bir standart teklif var mı?


C ++ bir numaralandırma türü verilerinin boyutu bağlama ? (Kapsamlı olanları da kapsayacak şekilde yapılmalıdır :-).
Acorn

3
Aynı boyutta olsalar bile (muhtemelen büyük olasılıkla), kullanmaya karşı argüman sizeof(A)nedir? Ayrıca: eğer farklı bir boyuta sahiplerse (olası değil), sizeof(std::underlying_type<A>)kullanımı basit yanlış olur.
Sander De Dycker

1
sizeof(std::underlying_type<A>)muhtemelen 1. Bunu mu demek istediniz ::type?
LF

1
@SanderDeDycker Evet, As ile uğraşırken kesinlikle kullanmak istiyor sizeof(A)ve kod ne tür bir türün umurunda değil A.
Acorn

@ LF Evet, yazım hatası. Başlık doğruydu.
Fantastik Bay Fox

Yanıtlar:


12

C ++ 03'te garanti edilmiştir (yine de kapatılmamış numaralandırmalar için).

[dcl.enum] Numaralandırma beyanları (benimkini vurgulayın)

6 Bir numaralandırmanın altta yatan türü, numaralandırmada tanımlanan tüm numaralandırıcı değerlerini temsil edebilen ayrılmaz bir tiptir. Tüm sayıcı değerlerini hiçbir integral türü temsil edemezse, sayım kötü biçimlendirilir. Bir numaralandırıcının değeri int veya işaretsiz bir int'e sığmadığı sürece, altta yatan tipin int'den daha büyük olmaması dışında uygulama tanımlıdır. Numaralandırma listesi boşsa, altta yatan tür, numaralandırmanın 0 değerinesizeof()sizeof() sahip tek bir numaralandırıcıya sahip olduğu gibidir. Bir numaralandırma türüne, numaralandırma türünün bir nesnesine veya bir numaralandırıcıya uygulanan değer , altta yatan tür .

Sonra n2347 geldi , kuvvetle yazılan numaralandırmalar ( enum class) ve çarpılamayan numaralandırmalar için diğer geliştirmeler için kabul edilen makale ve kalın yazıdaki cümle kaldırıldı. İlginç bir şekilde, teklifin daha önceki bir sürümü olan n2213 , kaldırılan cümlenin yerini aldı. Ancak benimsenen versiyona girmedi.

Modern C ++ 'da, boyutların aynı olması zorunluluğu yoktur. Pratik açıdan bakıldığında, uygulamaların numaralandırma boyutları için C ++ 03 tarafından öngörülen davranışı değiştirmesi olası değildir.

Standartta bir kusur olarak görülebilir.


2
C ++ 03'te dilde bulunmayan bir özellik için bir şey nasıl garanti edilebilir? oO
Yörüngedeki Hafiflik Yarışları

4
@LightnessRaceswithMonica - Altta yatan bir tür kavramı yeni değil. Sadece C ++ 11 bunu kendiniz belirtmenize izin verdi.
StoryTeller - Unslander Monica

Bunu biliyorum. Kapsamlı bir enum ( enum class) kavramı yeni.
Yörüngedeki Hafiflik Yarışları

@LightnessRaceswithMonica - Bence buradaki teklifte hata olabilir. İki şey yaptı, kapsamlı numaralandırmalar yaptı ve tüm numaralandırmaların (sadece kapsamlı olanlar değil) altta yatan türlerinin ayarlanmasına izin verdi. Bu nedenle C ++ 03'te "garantili".
StoryTeller - Unslander Monica

1
@ StoryTeller-UnslanderMonica Evet, soru bence aynı, kapsamı veya kapsamı dışında.
Fantastik Bay Fox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.