sizeof (enum) สามารถแตกต่างจาก sizeof (std :: รากฐาน_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)


การเชื่อมโยงขนาดของข้อมูลประเภท enum ใน 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 เว้นแต่ค่าของตัวแจงนับไม่สามารถพอดีกับ int หรือไม่ได้ลงนาม int ถ้ารายการตัวแจงนับว่างเปล่าชนิดที่อยู่ภายใต้จะเหมือนกับว่าการแจงนับมีตัวแจงนับเดียวที่มีค่า 0 ค่าที่sizeof()ใช้กับชนิดการแจงนับวัตถุของชนิดการแจงนับหรือการแจงนับเป็นค่าที่sizeof()ใช้กับ ประเภทพื้นฐาน

จากนั้นก็มาถึงn2347กระดาษที่นำมาใช้สำหรับการแจกแจงการพิมพ์จำนวนมาก ( enum class) และการปรับปรุงอื่น ๆ เพื่อการแจงนับที่ไม่ได้ จำกัด ขอบเขตและมีประโยคที่ลบออกอย่างชัดเจน น่าสนใจพอข้อเสนอรุ่นก่อนหน้านี้คือn2213มีการแทนที่ประโยคที่ลบออก แต่มันไม่ได้ทำให้เป็นรุ่นที่นำมาใช้

ดังนั้นใน C ++ ที่ทันสมัยไม่มีข้อผูกมัดสำหรับขนาดที่จะเหมือนกัน แม้ว่าจากมุมมองเชิงปฏิบัติแล้วการใช้งานไม่น่าจะมีการเปลี่ยนแปลงพฤติกรรมที่กำหนดโดย C ++ 03 สำหรับขนาดการแจงนับ

หนึ่งสามารถถือว่าเป็นข้อบกพร่องในมาตรฐาน


2
จะรับประกันบางสิ่งใน C ++ 03 สำหรับคุณลักษณะที่ไม่มีในภาษาได้อย่างไร oO
การแข่งขัน Lightness ใน Orbit

4
@LightnessRaceswithMonica - แนวคิดของประเภทพื้นฐานไม่ใช่เรื่องใหม่ เป็นเพียงว่า C ++ 11 อนุญาตให้คุณระบุด้วยตัวคุณเอง
StoryTeller - Unslander Monica

ฉันรู้แล้ว. ความคิดของขอบเขต enum ( enum class) เป็นเรื่องใหม่
Lightness Races ใน Orbit

@LightnessRaceswithMonica - ฉันคิดว่าอาจมีข้อผิดพลาดที่นี่ มันทำสองสิ่งแนะนำการกำหนดขอบเขตและอนุญาตให้การแจงนับทั้งหมด ดังนั้น "รับประกัน" ใน C ++ 03
StoryTeller - Unslander Monica

1
@ StoryTeller-UnslanderMonica ใช่คำถามเดียวกันฉันคิดว่า scoped หรือ unscoped
Fantastic Mr Fox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.