เหตุใด std :: is_pod จึงเลิกใช้งานใน C ++ 20


92

std::is_podอาจจะเลิกใช้งานใน C ++ 20
เหตุผลในการเลือกนี้คืออะไร? ฉันควรใช้อะไรแทนstd::is_podเพื่อทราบว่าประเภทเป็น POD จริงหรือไม่?



3
ทำไมคุณถึงต้องการทราบว่าประเภทเป็น POD หรือไม่?
Marc Glisse

8
@MarcGlisse คำถามเกี่ยวกับการเปลี่ยนแปลงในมาตรฐานหรือลักษณะเช่นนี้ไม่จำเป็นต้องหมายความว่าฉันต้องการใช้คุณลักษณะนั้น ฉันพบโน้ตที่เลิกใช้แล้วในขณะที่ใช้ Google และฉันแค่อยากรู้ว่าทำไมถึงเลิกใช้งาน
skypjack

คำถามของฉันเป็นคำตอบทางอ้อมจริง ๆ แล้วมันถูกลบออกเพราะ (โดยประมาณ) ไม่มีเหตุผลที่จะถามว่าประเภทคือ POD หรือไม่
Marc Glisse

3
ฉันจะใช้มันstatic_assertเพื่อให้แน่ใจว่าไม่มีใครสัมผัสโครงสร้างที่ควรแชร์กับรหัส C
Mirko

คำตอบ:


70

POD จะถูกแทนที่ด้วยสองประเภทที่ให้ความแตกต่างมากขึ้น การประชุมมาตรฐาน c ++ ในเดือนพฤศจิกายน 2017ได้กล่าวถึงเรื่องนี้:

เลิกใช้แนวคิดของ "ข้อมูลเก่าธรรมดา" (POD) มันถูกแทนที่ด้วยหมวดหมู่ที่เหมาะสมขึ้นอีกสองประเภทคือ "เล็กน้อย" และ "รูปแบบมาตรฐาน" "POD" เทียบเท่ากับ "เค้าโครงที่ไม่สำคัญและมาตรฐาน" แต่สำหรับรูปแบบโค้ดหลายรูปแบบข้อ จำกัด ที่แคบกว่าให้เป็นเพียงแค่ "เล็กน้อย" หรือ "รูปแบบมาตรฐาน" นั้นเหมาะสม เพื่อส่งเสริมความแม่นยำดังกล่าวแนวคิดของ“ POD” จึงเลิกใช้งาน ลักษณะไลบรารี is_pod ได้ถูกเลิกใช้งานตามลำดับเช่นกัน

สำหรับชนิดข้อมูลอย่างง่ายให้ใช้is_standard_layoutฟังก์ชันสำหรับชนิดข้อมูลเล็กน้อย (เช่นโครงสร้างอย่างง่าย) ให้ใช้is_trivialฟังก์ชัน


4
ดังนั้นพวกเขาจึงเพิ่มremove_cvrefในด้านหนึ่งนั่นคือลักษณะที่ประกอบขึ้นในขณะที่อีกด้านหนึ่งพวกเขาลบลักษณะประกอบอื่น ๆ ? ดูเหมือนคนบ้า :-)
skypjack

6
ดูเหมือนว่าจะเป็นรูปแบบที่ไม่สำคัญและเป็นมาตรฐานและประโยคที่เกี่ยวข้องกับการเรียกใช้ POD แบบเรียกซ้ำ คำสั่งซ้ำซ้ำซ้อนหรือไม่? คือมันรับประกันว่าstd::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})?
Yakk - Adam Nevraumont

3
@skypjack: ประเด็นของการลบ POD คือมันไม่ได้ตอบสนองวัตถุประสงค์อีกต่อไป องค์ประกอบของ "รูปแบบเล็กน้อย" และ "เค้าโครงมาตรฐาน" ไม่ได้มีความหมายอะไรเลยใน C ++ และไม่มีเหตุผลที่คุณจะ จำกัด อินเทอร์เฟซไว้ที่ POD แทนที่จะเป็น "เล็กน้อย" หรือ "เค้าโครงมาตรฐาน" ตามสิ่งที่คุณกำลังทำอยู่ กับมัน ในทางตรงกันข้ามการลบ "cvref" หมายถึงบางสิ่ง ประเภทผลลัพธ์คือประเภทออบเจ็กต์ที่ไม่มีคุณสมบัติ
Nicol Bolas

5
ฉันชื่นชมการเปลี่ยนแปลงนี้มาก ในฐานะโปรแกรมเมอร์ซอฟต์แวร์ระบบ "เค้าโครงมาตรฐาน" เป็นสิ่งที่ฉันให้ความสำคัญมาตลอดและข้อกำหนดสำหรับ POD ที่ไม่มีตัวสร้างทำให้อธิบายสำนวน "โครงสร้างที่มีตัวสร้าง" ทั่วไปของฉันไม่ถูกต้อง ก่อนหน้านี้ฉันถูกบังคับให้เรียกพวกนั้นว่า "pseudo-PODs" น่ารัก แต่มันทำให้แฟน ๆ อนิเมะบางคนมองคุณตลกเมื่อคุณพูดถึงการมี pseudopods ในโค้ดของคุณ
TED

2
มีstd::is_pod, std::is_triviaและ std::is_standard_layoutเวลารวบรวม? เนื่องจากในอัลกอริทึมคุณอาจต้องการอัลกอริทึมที่เร็วขึ้นโดยใช้ memcpy () ฯลฯ หากเข้ากันได้กับรูปแบบ C
SJHowe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.