Baru-baru ini muncul ulasan kode yang dalam contoh berikut:
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));
Kita seharusnya menggunakan sizeof(std::underlying_type<A>::type)
bukan sizeof(A)
. Mungkinkah ini berbeda? Apakah seseorang memiliki kutipan standar yang menjamin ini?
c++
language-lawyer
Tuan Fox yang luar biasa
sumber
sumber
sizeof(A)
? Juga: jika mereka berbeda ukuran (tidak mungkin), menggunakansizeof(std::underlying_type<A>)
akan menjadi salah.sizeof(std::underlying_type<A>)
mungkin1
. Apakah maksud Anda::type
?A
s, orang pasti ingin menggunakansizeof(A)
dan kodenya seharusnya tidak peduli apa jenisnyaA
.Jawaban:
Dalam C ++ 03 dijamin (well, untuk enumerasi yang tidak teropong toh).
Kemudian datang n2347 , makalah yang diadopsi untuk enumerasi yang sangat diketik (
enum class
) dan peningkatan lainnya untuk enumerasi yang tidak dicopot, dan kalimat tersebut dicetak tebal. Cukup menarik, versi proposal sebelumnya, n2213 , memiliki pengganti untuk kalimat yang dihapus. Tapi itu tidak masuk ke versi yang diadopsi.Jadi di C ++ modern, tidak ada kewajiban untuk ukurannya sama. Meskipun dari sudut pandang praktis, implementasi tidak mungkin telah mengubah perilaku yang ditentukan oleh C ++ 03 untuk ukuran enumerasi.
Orang bisa menganggapnya sebagai cacat dalam standar.
sumber
enum class
) adalah baru.