¿Por qué std :: is_pod está obsoleto en C ++ 20?


92

std::is_podprobablemente estará en desuso en C ++ 20.
¿Cuál es el motivo de esta elección? ¿Qué debo usar en lugar de std::is_podpara saber si un tipo es realmente un POD?



3
¿Por qué quiere saber si un tipo es POD?
Marc Glisse

8
@MarcGlisse Una pregunta sobre cambios en el estándar o un rasgo como este no significa necesariamente que quiera usar esa función. Encontré la nota obsoleta mientras buscaba en Google y tenía curiosidad por saber por qué estaba obsoleta.
skypjack

Mi pregunta fue en realidad una respuesta indirecta: se eliminó porque (aproximadamente) no hay razón para preguntar si un tipo es POD.
Marc Glisse

3
Lo usaría para static_assertasegurarme de que nadie toque estructuras que deberían compartirse con el código C.
Mirko

Respuestas:


70

POD está siendo reemplazado por dos categorías que dan más matices. La reunión estándar de c ++ en noviembre de 2017 tenía esto que decir al respecto:

Depreciar la noción de "datos antiguos sin formato" (POD). Se ha reemplazado por dos categorías de tipos más matizadas, "trivial" y "diseño estándar". "POD" es equivalente a "diseño estándar y trivial", pero para muchos patrones de código, es apropiada una restricción más estrecha a solo "diseño trivial" o simplemente "diseño estándar"; Por tanto, para fomentar tal precisión, la noción de "POD" quedó en desuso. El rasgo de biblioteca is_pod también se ha desaprobado en consecuencia.

Para tipos de datos simples use la is_standard_layoutfunción, para tipos de datos triviales (como estructuras simples) use la is_trivialfunción.


4
Entonces, agregan remove_cvrefpor un lado, ¿que es un rasgo compuesto, mientras que por el otro lado eliminan otros rasgos compuestos? Parece una locura. :-)
skypjack

6
Parece ser un diseño trivial Y estándar Y una cláusula que implica ser POD recursivamente. ¿Es redundante la cláusula recursiva? Es decir, ¿está garantizado eso std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})?
Yakk - Adam Nevraumont

3
@skypjack: El objetivo de eliminar POD es que ya no sirve para nada. La composición de "diseño estándar" y "trivial" en realidad no significa nada en C ++, y no hay ninguna razón por la que restringirías una interfaz a POD en lugar de "diseño estándar" o "trivial" en función de lo que estás haciendo. con eso. Por el contrario, eliminar "cvref" significa algo; el tipo resultante es un tipo de objeto sin calificadores.
Nicol Bolas

5
Yo, por mi parte, realmente aprecio este cambio. Como programador de software de sistemas, el "diseño estándar" era realmente lo que me importaba todo el tiempo, y el requisito de que los POD no tuvieran constructores hacía que no describieran correctamente mi lenguaje común de "estructuras con constructores". Anteriormente me vi obligado a llamar a esos "pseudo-POD". Lindo, pero hace que ciertos fanáticos del anime se vean graciosos cuando hablas de tener pseudópodos en tu código.
TED

2
Son std::is_pod, std::is_triviay std::is_standard_layoutel tiempo de compilación? Porque en los algoritmos, es posible que desee un algoritmo más rápido usando memcpy (), etc. si es compatible con el diseño C.
SJHowe
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.