Warum ist std :: is_pod in C ++ 20 veraltet?

87

std::is_podwird wahrscheinlich in C ++ 20 veraltet sein.
Was ist der Grund für diese Wahl? Was sollte ich verwenden, um std::is_podzu wissen, ob ein Typ tatsächlich ein POD ist?

Skypjack
quelle
3
Warum möchten Sie wissen, ob ein Typ POD ist?
Marc Glisse
8
@MarcGlisse Eine Frage zu Änderungen im Standard oder einem solchen Merkmal bedeutet nicht unbedingt, dass ich diese Funktion verwenden möchte. Ich fand die veraltete Notiz beim Googeln und war nur neugierig zu wissen, warum sie veraltet war.
Skypjack
Meine Frage war eigentlich eine indirekte Antwort: Sie wurde entfernt, weil es (ungefähr) keinen Grund gibt zu fragen, ob ein Typ POD ist.
Marc Glisse
3
Ich würde es für a verwenden, static_assertum sicherzustellen, dass niemand Strukturen berührt, die mit C-Code geteilt werden sollen.
Mirko

Antworten:

65

POD wird durch zwei Kategorien ersetzt, die mehr Nuancen ergeben. Das c ++ Standard Meeting im November 2017 hatte folgendes zu sagen:

Ablehnung des Begriffs „einfache alte Daten“ (POD). Es wurde durch zwei weitere nuancierte Kategorien von Typen ersetzt, "trivial" und "Standard-Layout". "POD" entspricht "Trivial- und Standardlayout", aber für viele Codemuster ist eine engere Beschränkung auf "Trivial" oder nur "Standardlayout" angemessen. Um diese Präzision zu fördern, wurde der Begriff „POD“ daher abgelehnt. Entsprechend veraltet ist auch das Bibliotheksmerkmal is_pod.

Verwenden Sie für einfache Datentypen die is_standard_layoutFunktion, für einfache Datentypen (z. B. einfache Strukturen) dieis_trivial Funktion.

DJ Klomp
quelle
4
Also fügen sie remove_cvrefauf der einen Seite hinzu, das ist ein zusammengesetztes Merkmal, während sie auf der anderen Seite andere zusammengesetzte Merkmale entfernen? Es scheint verrückt zu sein. :-)
Skypjack
6
Es scheint ein triviales UND Standardlayout UND eine Klausel zu sein, die das rekursive POD beinhaltet. Ist die rekursive Klausel überflüssig? Dh ist das garantiert std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})?
Yakk - Adam Nevraumont
3
@skypjack: Der Punkt beim Entfernen von POD ist, dass es keinen Zweck mehr erfüllt. Die Zusammensetzung von "trivial" und "Standardlayout" bedeutet in C ++ eigentlich nichts, und es gibt keinen Grund, warum Sie eine Schnittstelle auf POD beschränken würden, anstatt "trivial" oder "Standardlayout", je nachdem, was Sie tatsächlich tun damit. Im Gegensatz dazu bedeutet das Entfernen von "cvref" etwas; Der resultierende Typ ist ein Objekttyp ohne Qualifizierer.
Nicol Bolas
5
Ich jedenfalls schätze diese Veränderung sehr. Als System-Software-Programmierer war mir "Standard-Layout" wirklich wichtig, und die Anforderung, dass PODs keine Konstruktoren haben, führte dazu, dass sie meine gängigen Redewendungen "Strukturen mit Konstruktoren" nicht richtig beschreiben. Zuvor war ich gezwungen, diese "Pseudo-PODs" zu nennen. Süß, aber es macht bestimmte Anime-Fans lustig, wenn du davon sprichst, Pseudopoden in deinem Code zu haben.
Ted
2
Ist std::is_pod, std::is_triviaund std::is_standard_layoutCompile-Zeit? Denn in Algorithmen wünschen Sie sich möglicherweise einen schnelleren Algorithmus mit memcpy () usw., wenn das C-Layout kompatibel ist.
SJHowe