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?



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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.