Dlaczego std :: is_pod jest przestarzałe w C ++ 20?

92

std::is_podbędzie prawdopodobnie przestarzałe w C ++ 20.
Jaki jest powód tego wyboru? Czego należy używać zamiast, std::is_podaby wiedzieć, czy typ jest faktycznie POD?

skypjack
źródło
3
Dlaczego chcesz wiedzieć, czy typ to POD?
Marc Glisse,
8
@MarcGlisse Pytanie o zmiany w standardzie lub takiej cechy niekoniecznie oznacza, że ​​chcę z niej skorzystać. Znalazłem nieaktualną notatkę podczas wyszukiwania w Google i byłem po prostu ciekawy, dlaczego została wycofana.
skypjack
Moje pytanie było właściwie pośrednią odpowiedzią: zostało usunięte, ponieważ (z grubsza) nie ma powodu, aby pytać, czy typ to POD.
Marc Glisse,
3
Użyłbym go jako a, static_assertaby upewnić się, że nikt nie dotyka struktur, które powinny być współdzielone z kodem C.
Mirko,

Odpowiedzi:

70

POD jest zastępowany dwiema kategoriami, które dają więcej niuansów. Na standardowym spotkaniu C ++ w listopadzie 2017 roku można było o tym powiedzieć:

Wycofanie się z pojęcia „zwykłych starych danych” (POD). Zastąpiono go dwoma bardziej zniuansowanymi kategoriami typów, „trywialnym” i „standardowym układem”. „POD” jest odpowiednikiem „trywialnego i standardowego układu”, ale dla wielu wzorców kodu właściwe jest węższe ograniczenie do „trywialnego” lub tylko „standardowego układu”; aby zachęcić do takiej precyzji, pojęcie „POD” zostało zatem wycofane. Cecha biblioteki is_pod również została odpowiednio przestarzała.

Dla prostych typów danych użyj is_standard_layoutfunkcji, dla trywialnych typów danych (takich jak proste struktury) użyj is_trivialfunkcji.

DJ Klomp
źródło
4
Czyli remove_cvrefz jednej strony dodają , to jest cecha złożona, a z drugiej usuwają inne cechy? Wydaje się szalone. :-)
skypjack
6
Wydaje się, że jest to trywialne ORAZ standardowy układ ORAZ klauzula obejmująca rekurencyjne POD. Czy klauzula rekurencyjna jest zbędna? To znaczy, czy jest to gwarantowane std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})?
Yakk - Adam Nevraumont
3
@skypjack: Celem usunięcia POD jest to, że nie służy on już żadnemu celowi. Kompozycja „trywialnego” i „standardowego układu” w rzeczywistości nic nie znaczy w C ++ i nie ma powodu, dla którego miałbyś ograniczyć interfejs do POD zamiast „trywialnego” lub „standardowego układu” w oparciu o to, co faktycznie robisz z tym. Z kolei usunięcie „cvref” coś znaczy; wynikowy typ jest typem obiektu bez kwalifikatorów.
Nicol Bolas,
5
Naprawdę doceniam tę zmianę. Jako programista oprogramowania systemowego, „standardowy układ” był naprawdę tym, na czym mi zależało przez cały czas, a wymóg dla POD-ów nie posiadających konstruktorów sprawił, że nie opisywały poprawnie mojego wspólnego idiomu „struktury z konstruktorami”. Wcześniej byłem zmuszony nazywać te „pseudo-POD”. Urocze, ale sprawia, że ​​niektórzy fani anime wyglądają na ciebie śmiesznie, kiedy mówisz o pseudonóżach w swoim kodzie.
TED,
2
Czy std::is_pod, std::is_triviai std::is_standard_layoutkompilacji? Ponieważ w algorytmach możesz chcieć szybszego algorytmu używającego memcpy () itp., Jeśli jest zgodny z układem C.
SJHowe