Pourquoi std :: is_pod est-il obsolète dans C ++ 20?

92

std::is_podsera probablement obsolète en C ++ 20.
Quelle est la raison de ce choix? Que dois-je utiliser à la place de std::is_podsavoir si un type est en fait un POD?

skypjack
la source
3
Pourquoi voulez-vous savoir si un type est POD?
Marc Glisse
8
@MarcGlisse Une question sur les changements dans la norme ou un trait comme celui-ci ne signifie pas nécessairement que je souhaite utiliser cette fonctionnalité. J'ai trouvé la note obsolète lors de la recherche sur Google et j'étais simplement curieuse de savoir pourquoi elle était obsolète.
skypjack
Ma question était en fait une réponse indirecte: elle a été supprimée car (en gros) il n'y a aucune raison de demander si un type est POD.
Marc Glisse
3
Je l'utiliserais pour static_assertm'assurer que personne ne touche aux structures qui devraient être partagées avec le code C.
Mirko le

Réponses:

70

Le POD est remplacé par deux catégories qui donnent plus de nuances. La réunion de la norme C ++ en novembre 2017 avait ceci à dire à ce sujet:

Déprécier la notion de «plain old data» (POD). Il a été remplacé par deux catégories de types plus nuancées, «trivial» et «standard-layout». «POD» équivaut à «disposition triviale et standard», mais pour de nombreux modèles de code, une restriction plus étroite à «trivial» ou simplement «disposition standard» est appropriée; pour encourager une telle précision, la notion de «POD» a donc été déconseillée. Le trait de bibliothèque is_pod a également été déprécié en conséquence.

Pour les types de données simples, utilisez la is_standard_layoutfonction, pour les types de données triviaux (tels que les structures simples), utilisez la is_trivialfonction.

DJ Klomp
la source
4
Donc, ils ajoutent remove_cvrefd'un côté, c'est un trait composé, tandis que de l'autre côté ils enlèvent d'autres traits composés? Cela semble insensé. :-)
skypjack
6
Cela semble être une mise en page banale ET standard ET une clause impliquant le fait d'être récursivement POD. La clause récursive est-elle redondante? Ie, est-ce garanti std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})?
Yakk - Adam Nevraumont
3
@skypjack: Le but de la suppression du POD est qu'il ne sert plus à rien. La composition de "trivial" et "standard layout" ne veut rien dire en C ++, et il n'y a aucune raison pour laquelle vous limiteriez une interface à POD plutôt que "trivial" ou "standard layout" en fonction de ce que vous faites réellement avec ça. En revanche, supprimer "cvref" signifie quelque chose; le type résultant est un type d'objet sans qualificatif.
Nicol Bolas
5
Pour ma part, j'apprécie vraiment ce changement. En tant que programmeur de logiciels systèmes, la "mise en page standard" était vraiment ce qui m'intéressait depuis le début, et l'exigence pour les POD de ne pas avoir de constructeurs les empêchait de décrire correctement mon idiome commun de "structs with constructors". Auparavant, j'étais obligé d'appeler ces "pseudo-POD". Mignon, mais cela fait que certains fans d'anime vous regardent drôles lorsque vous parlez d'avoir des pseudopodes dans votre code.
TED
2
Sont std::is_pod, std::is_triviaet la std::is_standard_layoutcompilation? Parce que dans les algorithmes, vous pourriez souhaiter un algorithme plus rapide utilisant memcpy () etc. si C-layout est compatible.
SJHowe